{-# OPTIONS -fglasgow-exts #-} -- By Jesse Tov (ccs.neu.edu!tov), November 2007 -- This is a DRAFT. Later versions at http://www.ccs.neu.edu/home/tov/. module CMLChan ( CMLChan, newCMLChan, writeCMLChan, readCMLChan, ) where import Data.Typeable import Control.Concurrent.MVar newtype CMLChan a = CC (MVar (MVar a)) deriving Typeable newCMLChan = newEmptyMVar >>= return . CC writeCMLChan (CC cc) v = do mv <- takeMVar cc putMVar mv v readCMLChan (CC cc) = do mv <- newEmptyMVar putMVar cc mv takeMVar mv tryWriteCMLChan (CC cc) v = do mv <- tryTakeMVar cc case mv of Just mv -> putMVar mv v >> return True Nothing -> return False