unagi-chan-0.3.0.0: src/Control/Concurrent/Chan/Unagi/NoBlocking.hs
module Control.Concurrent.Chan.Unagi.NoBlocking (
{- | 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()
-- * 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.hs at 065cd68010
-- TODO additonal functions:
-- - faster write/read-many that increments counter by N
import Control.Concurrent.Chan.Unagi.NoBlocking.Internal hiding (Stream)
import Control.Concurrent.Chan.Unagi.NoBlocking.Types
-- | Create a new channel, returning its write and read ends.
newChan :: 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 :: InChan a -> [a] -> IO ()
{-# INLINABLE writeList2Chan #-}
writeList2Chan ch = sequence_ . map (writeChan ch)