úÎ4É1é%      !"#$ Safe-Infered %&'()*+,-./01 %&'()*+,-. %&'()*+,-./01non-portable (requires STM) experimentallibraries@haskell.org Safe-Infered= is an abstract type representing an unbounded FIFO channel. $Build and returns a new instance of  IO version of ). This is useful for creating top-level  s using , because using    inside  isn't  possible. Write a value to a . Read the next value from the .  Duplicate a :: the duplicate channel begins empty, but data written to N either channel from then on will be available from both. Hence this creates F a kind of broadcast channel, where data written by anyone is seen by  everyone else. JPut a data item back onto a channel, where it will be the next item read. Returns 2 if the supplied  is empty. non-portable (requires STM) experimentallibraries@haskell.org Safe-Infered A # is a synchronising variable, used Dfor communication between concurrent threads. It can be thought of &as a box, which may be empty or full.  Create a $ which contains the supplied value. IO version of ). This is useful for creating top-level  s using , because using    inside  isn't  possible.  Create a  which is initially empty. IO version of ). This is useful for creating top-level  s using , because using    inside  isn't  possible. Return the contents of the  . If the  is currently  empty, the transaction will   . After a ,  the  is left empty.  A version of  that does not  . The   function returns 3 if the  was empty, or 4 a if  the  was full with contents a . After , the   is left empty. Put a value into a  . If the  is currently full,   will  .  A version of  that does not  . The  $ function attempts to put the value a into the  , returning  2 if it was successful, or 5 otherwise. This is a combination of  and ; ie. it takes the value  from the %, puts it back, and also returns it. !Swap the contents of a  for a new value. "Check whether a given  is empty. >Notice that the boolean value returned is just a snapshot of  the state of the .. By the time you get to react on its result,  the 5 may have been filled (or emptied) - so be extremely * careful when using this operation. Use  instead if possible.  !"  !"  !"  !"non-portable (requires STM) experimentallibraries@haskell.org Safe-Inferednon-portable (requires STM) experimentallibraries@haskell.org Safe-Infered#6TArray is a transactional array, supporting the usual 6  interface for mutable arrays. It is currently implemented as Array ix (TVar e), I but it may be replaced by a more efficient implementation in the future 0 (the interface will remain the same, however). #7###7non-portable (requires STM) experimentallibraries@haskell.org Safe-Infered$  $  $ $ non-portable (requires STM) experimentallibraries@haskell.org Safe-Infered%  !"#$8               !"#$%&'()*+,-./01234567 89 8:56;<=>?@ stm-2.2.0.1Control.Concurrent.STM.TVarControl.Monad.STMControl.Concurrent.STM.TChanControl.Concurrent.STM.TMVarControl.Concurrent.STM.TArrayControl.Sequential.STMSystem.IO.UnsafeunsafePerformIOControl.Concurrent.STMbase GHC.Conc.IO registerDelay GHC.Conc.Sync writeTVarreadTVar readTVarIO newTVarIOnewTVaralwaysalwaysSucceedscatchSTMthrowSTMorElseretry atomicallySTMTVarTChannewTChan newTChanIO writeTChan readTChandupTChan unGetTChan isEmptyTChanTMVarnewTMVar newTMVarIO newEmptyTMVarnewEmptyTMVarIO takeTMVar tryTakeTMVarputTMVar tryPutTMVar readTMVar swapTMVar isEmptyTMVarTArraycheck $fMonadSTM$fApplicativeSTM $fFunctorSTMghc-prim GHC.TypesTrue Data.MaybeNothingJustFalse array-0.4.0.0Data.Array.BaseMArray$fMArrayTArrayeSTM