Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- newChan :: IO (InChan a, OutChan a)
- data InChan a
- data OutChan a
- readChan :: OutChan a -> IO a
- readChanOnException :: OutChan a -> (IO a -> IO ()) -> IO a
- tryReadChan :: OutChan a -> IO (Element a, IO a)
- newtype Element a = Element {}
- getChanContents :: OutChan a -> IO [a]
- writeChan :: InChan a -> a -> IO ()
- writeList2Chan :: InChan a -> [a] -> IO ()
- dupChan :: InChan a -> IO (OutChan a)
Documentation
General-purpose concurrent FIFO queue. If you are trying to send messages of a primitive unboxed type, you may wish to use Control.Concurrent.Chan.Unagi.Unboxed which should be slightly faster and perform better when a queue grows very large. If you need a bounded queue, see Control.Concurrent.Chan.Unagi.Bounded. And if your application doesn't require blocking reads, or is single-producer or single-consumer, then Control.Concurrent.Chan.Unagi.NoBlocking will offer lowest latency.
Creating channels
newChan :: IO (InChan a, OutChan a) Source #
Create a new channel, returning its write and read ends.
The write end of a channel created with newChan
.
The read end of a channel created with newChan
.
Channel operations
Reading
readChan :: OutChan a -> IO a Source #
Read an element from the chan, blocking if the chan is empty.
Note re. exceptions: When an async exception is raised during a readChan
the message that the read would have returned is likely to be lost, even when
the read is known to be blocked on an empty queue. If you need to handle
this scenario, you can use readChanOnException
.
readChanOnException :: OutChan a -> (IO a -> IO ()) -> IO a Source #
Like readChan
but allows recovery of the queue element which would have
been read, in the case that an async exception is raised during the read. To
be precise exceptions are raised, and the handler run, only when
readChanOnException
is blocking.
The second argument is a handler that takes a blocking IO action returning
the element, and performs some recovery action. When the handler is called,
the passed IO a
is the only way to access the element.
tryReadChan :: OutChan a -> IO (Element a, IO a) Source #
Returns immediately with:
- an
future, which returns one unique element when it becomes available viaElement
atryRead
. - a blocking
IO
action that returns the element when it becomes available.
Note: This is a destructive operation. See Element
for more details.
If you're using this function exclusively you might find the implementation in Control.Concurrent.Chan.Unagi.NoBlocking is faster.
Note re. exceptions: When an async exception is raised during a tryReadChan
the message that the read would have returned is likely to be lost, just as
it would be when raised directly after this function returns.
An IO
action that returns a particular enqueued element when and if it
becomes available.
Each Element
corresponds to a particular enqueued element, i.e. a returned
Element
always offers the only means to access one particular enqueued
item. The value returned by tryRead
moves monotonically from Nothing
to Just a
when and if an element becomes available, and is idempotent at
that point.
So for instance:
(in, out) <- newChan (el, _) <- tryReadChan out -- READ FROM EMPTY CHAN writeChan in "msg1" writeChan in "msg2" readChan out -- RETURNS "msg2" tryRead el -- RETURNS "msg1" (which would otherwise be lost)
getChanContents :: OutChan a -> IO [a] Source #
Return a lazy infinite list representing the contents of the supplied OutChan, much like System.IO.hGetContents.
Writing
writeList2Chan :: InChan a -> [a] -> IO () Source #
Write an entire list of items to a chan type. Writes here from multiple threads may be interleaved, and infinite lists are supported.