import Control.Concurrent hiding (Chan, newChan, readChan, writeChan, dupChan) import Control.Exception -- <> -- <> -- <> -- < a -> IO () wrongWriteChan (Chan _ writeVar) val = do newHole <- newEmptyMVar modifyMVar_ writeVar $ \oldHole -> do putMVar oldHole (Item val newHole) -- <1> return newHole -- <2> -- >> -- < a -> IO () writeChan (Chan _ writeVar) val = do newHole <- newEmptyMVar mask_ $ do oldHole <- takeMVar writeVar putMVar oldHole (Item val newHole) putMVar writeVar newHole -- >> -- < IO a readChan (Chan readVar _) = do modifyMVar readVar $ \stream -> do Item val tail <- readMVar stream return (tail, val) -- >> main = do c <- newChan writeChan c 'a' readChan c >>= print