concurrent-split-0.0.1: src/Control/Concurrent/Split/MVar.hs
module Control.Concurrent.Split.MVar (
T,
In,
Out,
newEmpty,
take, tryTake,
put, tryPut,
) where
import qualified Control.Concurrent.Split.Class as Split
import qualified Control.Concurrent.MVar as MVar
import Prelude (IO, Maybe, Bool, return, )
newtype T dir a = Cons (MVar.MVar a)
type In = T Split.In
type Out = T Split.Out
instance Split.C T where
new = newEmpty
read = take
write = put
newEmpty :: IO (In a, Out a)
newEmpty = do
v <- MVar.newEmptyMVar
return (Cons v, Cons v)
take :: Out a -> IO a
take (Cons v) = MVar.takeMVar v
tryTake :: Out a -> IO (Maybe a)
tryTake (Cons v) = MVar.tryTakeMVar v
put :: In a -> a -> IO ()
put (Cons v) a = MVar.putMVar v a
tryPut :: In a -> a -> IO Bool
tryPut (Cons v) a = MVar.tryPutMVar v a