import Control.Concurrent hiding (Chan, newChan, readChan, writeChan) -- <> -- <> -- <> -- < a -> IO () writeChan (Chan _ writeVar) val = do newHole <- newEmptyMVar oldHole <- takeMVar writeVar putMVar oldHole (Item val newHole) putMVar writeVar newHole -- >> -- < IO a readChan (Chan readVar _) = do stream <- takeMVar readVar -- <1> Item val tail <- takeMVar stream -- <2> putMVar readVar tail -- <3> return val -- >> -- < IO (Chan a) dupChan (Chan _ writeVar) = do hole <- readMVar writeVar newReadVar <- newMVar hole return (Chan newReadVar writeVar) -- >> main = do c <- newChan writeChan c 'a' readChan c >>= print