úί¤N      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMIO experimental John Launchbury, john@galois.com Safe-Infered   concurrency experimental John Launchbury, john@galois.com Safe-Infered'1Included to maintain name-for-name compatibility  with Control.Concurrent  !"#$%&'()*+,N  !"#$%&'()*+,  !"#$%&'()*+, !"#$%&'()*+,Nconcurrency, requires STM experimental John Launchbury, john@galois.com Safe-Infered-BThe atomically function allows STM to be called directly from any 7 monad which contains IO, i.e. is a member of MonadIO. 223 is an atomic update operation which provides both < the former value and the newly computed value as a result. -./0123456789:;<=>?@ABCDEFGHIJ' -./0123456789:;<=>?@ABCDEFGHIJ'- ./0123456789:;<=>?@ABCDEFGHIJ-./0123456789:;<=>?@ABCDEFGHIJ concurrency experimental John Launchbury, john@galois.com Safe-InferedKK establishes the context for L , by running F a daemon while its argument is executing. The daemon is terminated  once the argument to K finishes. LL= is the main user level function of the module. The function J prints its argument on stdout, prefixed by its process number. The user B similarly selects the recipient by prefixing the process number,  e.g. 23:4. Active prompts will reprompt when !! is entered. MM7 sends output to stdout, ensuring that lines are whole 2 and uninterrupted (including the final newline). KLMKLMKLMKLMO      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^monadIO-0.10.1.2Control.Concurrent.MonadIOControl.Concurrent.STM.MonadIOData.IORef.MonadIOControl.Concurrent.StdInOutbaseControl.Concurrent.ChanChan GHC.Conc.SyncalwaysalwaysSucceedscatchSTMorElseretryThreadIdSTMTVar GHC.IORefIORefGHC.MVarMVartransformers-0.3.0.0Control.Monad.IO.ClassMonadIOliftIO stm-2.2.0.1Control.Monad.STMcheckControl.Concurrent.STM.TMVarTMVarnewIORef readIORef writeIORef modifyIORefatomicModifyIORefHasForkfork newEmptyMVarnewMVartakeMVarputMVarreadMVarswapMVar tryTakeMVar tryPutMVar isEmptyMVarnewChan writeChanreadChandupChan unGetChan isEmptyChangetChanContentswriteList2ChanforkIO myThreadId killThreadthrowToyield threadDelay atomicallynewTVarreadTVar writeTVar registerDelay modifyTVar modifyTVar_ newTVarSTM readTVarSTM writeTVarSTMnewTMVar newEmptyTMVar takeTMVarputTMVar readTMVar swapTMVar tryTakeTMVar tryPutTMVar isEmptyTMVar modifyTMVar modifyTMVar_ newTMVarSTMnewEmptyTMVarSTM takeTMVarSTM putTMVarSTM readTMVarSTM swapTMVarSTMtryTakeTMVarSTMtryPutTMVarSTMisEmptyTMVarSTM setupStdInOutprompt putStrLine $fHasForkIO