module Control.Concurrent.Chan.Unagi.NoBlocking.Unboxed (
{- | General-purpose concurrent FIFO queue without blocking reads, and with
   optimized variants for single-threaded producers and/or consumers.  This
   variant, and even more so the SP/SC variants, offer the lowest latency of
   all of the implementations in this library.
 -}
    -- * Creating channels
      newChan
    , InChan(), OutChan()
    , UnagiPrim(..)
    -- * Channel operations
    -- ** Reading
    , tryReadChan
    , readChan
    , Element(..)
    -- *** Utilities
    , isActive
    -- ** Writing
    , writeChan
    , writeList2Chan
    -- ** Broadcasting
    , dupChan
    -- ** Streaming
    , Stream(..), Next(..)
    , streamChan
    ) where

-- Forked from src/Control/Concurrent/Chan/Unagi/NoBlocking.hs at 9e2306330e

-- TODO additonal functions:
--   - faster write/read-many that increments counter by N

import Control.Concurrent.Chan.Unagi.NoBlocking.Unboxed.Internal hiding (Stream)
import Control.Concurrent.Chan.Unagi.NoBlocking.Types
import Control.Concurrent.Chan.Unagi.Unboxed(UnagiPrim(..))

-- | Create a new channel, returning its write and read ends.
newChan :: UnagiPrim a=> IO (InChan a, OutChan a)
newChan = newChanStarting (maxBound - 10)
    -- lets us test counter overflow in tests and normal course of operation


-- | Write an entire list of items to a chan type. Writes here from multiple
-- threads may be interleaved, and infinite lists are supported.
writeList2Chan :: UnagiPrim a=> InChan a -> [a] -> IO ()
{-# INLINABLE writeList2Chan #-}
writeList2Chan ch = sequence_ . map (writeChan ch)