Skip to content

Instantly share code, notes, and snippets.

@stesh
Created February 3, 2013 18:53
Show Gist options
  • Select an option

  • Save stesh/4703128 to your computer and use it in GitHub Desktop.

Select an option

Save stesh/4703128 to your computer and use it in GitHub Desktop.
type Stream a = MVar (Item a)
data Item a = Item a (Stream a)
data Channel a = Channel (MVar (Stream a)) (MVar (Stream a))
newChannel :: IO (Channel a)
newChannel = do
hole <- newEmptyMVar
readVar <- newMVar hole
writeVar <- newMVar hole
return $ Channel readVar writeVar
writeChannel :: Channel a -> a -> IO ()
writeChannel (Channel _ writeVar) val = do
newHole <- newEmptyMVar
oldHole <- takeMVar writeVar
putMVar writeVar newHole
putMVar oldHole (Item val newHole)
readChannel :: Channel a -> IO a
readChannel (Channel readVar _) = do
stream <- takeMVar readVar
Item val new <- takeMVar stream
putMVar readVar new
return val
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment