Chan package:rebase

Chan is an abstract type representing an unbounded FIFO channel.
TChan is an abstract type representing an unbounded FIFO channel.
Clone a TChan: similar to dupTChan, but the cloned channel starts with the same content available as the original channel.
Duplicate a Chan: the duplicate channel begins empty, but data written to either channel from then on will be available from both. Hence this creates a kind of broadcast channel, where data written by anyone is seen by everyone else. (Note that a duplicated channel is not equal to its original. So: fmap (c /=) $ dupChan c returns True for all c.)
Duplicate a TChan: the duplicate channel begins empty, but data written to either channel from then on will be available from both. Hence this creates a kind of broadcast channel, where data written by anyone is seen by everyone else.
Return a lazy list representing the contents of the supplied Chan, much like hGetContents.
Returns True if the supplied TChan is empty.
Create a write-only TChan. More precisely, readTChan will retry even after items have been written to the channel. The only way to read a broadcast channel is to duplicate it with dupTChan. Consider a server that broadcasts messages to clients:
serve :: TChan Message -> Client -> IO loop
serve broadcastChan client = do
myChan <- dupTChan broadcastChan
forever $ do
message <- readTChan myChan
send client message
The problem with using newTChan to create the broadcast channel is that if it is only written to and never read, items will pile up in memory. By using newBroadcastTChan to create the broadcast channel, items can be garbage collected after clients have seen them.
IO version of newBroadcastTChan.
Build and returns a new instance of Chan.
Build and return a new instance of TChan
IO version of newTChan. This is useful for creating top-level TChans using unsafePerformIO, because using atomically inside unsafePerformIO isn't possible.
Get the next value from the TChan without removing it, retrying if the channel is empty.
Read the next value from the Chan. Blocks when the channel is empty. Since the read end of a channel is an MVar, this operation inherits fairness guarantees of MVars (e.g. threads blocked in this operation are woken up in FIFO order). Throws BlockedIndefinitelyOnMVar when the channel is empty and no other thread holds a reference to the channel.
Read the next value from the TChan.
A version of peekTChan which does not retry. Instead it returns Nothing if no value is available.
A version of readTChan which does not retry. Instead it returns Nothing if no value is available.
Put a data item back onto a channel, where it will be the next item read.
Write a value to a Chan.
Write an entire list of items to a Chan.
Write a value to a TChan.