
Why not
import Control.Applicative import Control.Concurrent.MVar import Control.Exception
data SampleVar a = SV {svLock :: MVar (), svData :: MVar a}
newEmptySampleVar :: IO (SampleVar a) newEmptySampleVar = SV <$> newMVar () <$> newEmptyMVar
newSampleVar :: a -> IO (SampleVar a) newSampleVar x = SV <$> newMVar () <$> newMVar x
emptySampleVar :: SampleVar a -> IO () emptySampleVar = (>> return ()) . tryTakeMVar . svData
readSampleVar :: SampleVar a -> IO a readSampleVar = takeMVar . svData
isEmptySampleVar :: SampleVar a -> IO Bool isEmptySampleVar = isEmptyMVar . svData
writeSampleVar :: SampleVar a -> a -> IO () writeSampleVar s x = block $ withMVar (svLock s) $ const $ do tryTakeMVar (svData s) putMVar (svData s) x
? -- Felipe.