{-# LANGUAGE CPP #-}
{-# LANGUAGE MagicHash #-}
{-# LANGUAGE UnboxedTuples #-}
module Data.Primitive.MVar
( MVar(..)
, newMVar
, isEmptyMVar
, newEmptyMVar
, putMVar
, readMVar
, takeMVar
, tryPutMVar
, tryReadMVar
, tryTakeMVar
) where
import Control.Monad.Primitive
import GHC.Exts
( MVar#, newMVar#, takeMVar#, sameMVar#, putMVar#, tryTakeMVar#, isEmptyMVar#, tryPutMVar#, (/=#)
, readMVar#, tryReadMVar#, isTrue# )
data MVar s a = MVar (MVar# s a)
instance Eq (MVar s a) where
MVar MVar# s a
mvar1# == :: MVar s a -> MVar s a -> Bool
== MVar MVar# s a
mvar2# = Int# -> Bool
isTrue# (MVar# s a -> MVar# s a -> Int#
forall s a. MVar# s a -> MVar# s a -> Int#
sameMVar# MVar# s a
mvar1# MVar# s a
mvar2#)
newEmptyMVar :: PrimMonad m => m (MVar (PrimState m) a)
newEmptyMVar :: forall (m :: * -> *) a. PrimMonad m => m (MVar (PrimState m) a)
newEmptyMVar = (State# (PrimState m)
-> (# State# (PrimState m), MVar (PrimState m) a #))
-> m (MVar (PrimState m) a)
forall a.
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
forall (m :: * -> *) a.
PrimMonad m =>
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
primitive ((State# (PrimState m)
-> (# State# (PrimState m), MVar (PrimState m) a #))
-> m (MVar (PrimState m) a))
-> (State# (PrimState m)
-> (# State# (PrimState m), MVar (PrimState m) a #))
-> m (MVar (PrimState m) a)
forall a b. (a -> b) -> a -> b
$ \ State# (PrimState m)
s# ->
case State# (PrimState m)
-> (# State# (PrimState m), MVar# (PrimState m) a #)
forall d a. State# d -> (# State# d, MVar# d a #)
newMVar# State# (PrimState m)
s# of
(# State# (PrimState m)
s2#, MVar# (PrimState m) a
svar# #) -> (# State# (PrimState m)
s2#, MVar# (PrimState m) a -> MVar (PrimState m) a
forall s a. MVar# s a -> MVar s a
MVar MVar# (PrimState m) a
svar# #)
newMVar :: PrimMonad m => a -> m (MVar (PrimState m) a)
newMVar :: forall (m :: * -> *) a.
PrimMonad m =>
a -> m (MVar (PrimState m) a)
newMVar a
value = do
MVar (PrimState m) a
mvar <- m (MVar (PrimState m) a)
forall (m :: * -> *) a. PrimMonad m => m (MVar (PrimState m) a)
newEmptyMVar
MVar (PrimState m) a -> a -> m ()
forall (m :: * -> *) a.
PrimMonad m =>
MVar (PrimState m) a -> a -> m ()
putMVar MVar (PrimState m) a
mvar a
value
MVar (PrimState m) a -> m (MVar (PrimState m) a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return MVar (PrimState m) a
mvar
takeMVar :: PrimMonad m => MVar (PrimState m) a -> m a
takeMVar :: forall (m :: * -> *) a. PrimMonad m => MVar (PrimState m) a -> m a
takeMVar (MVar MVar# (PrimState m) a
mvar#) = (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
forall a.
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
forall (m :: * -> *) a.
PrimMonad m =>
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
primitive ((State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a)
-> (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
forall a b. (a -> b) -> a -> b
$ \ State# (PrimState m)
s# -> MVar# (PrimState m) a
-> State# (PrimState m) -> (# State# (PrimState m), a #)
forall d a. MVar# d a -> State# d -> (# State# d, a #)
takeMVar# MVar# (PrimState m) a
mvar# State# (PrimState m)
s#
readMVar :: PrimMonad m => MVar (PrimState m) a -> m a
readMVar :: forall (m :: * -> *) a. PrimMonad m => MVar (PrimState m) a -> m a
readMVar (MVar MVar# (PrimState m) a
mvar#) = (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
forall a.
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
forall (m :: * -> *) a.
PrimMonad m =>
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
primitive ((State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a)
-> (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
forall a b. (a -> b) -> a -> b
$ \ State# (PrimState m)
s# -> MVar# (PrimState m) a
-> State# (PrimState m) -> (# State# (PrimState m), a #)
forall d a. MVar# d a -> State# d -> (# State# d, a #)
readMVar# MVar# (PrimState m) a
mvar# State# (PrimState m)
s#
putMVar :: PrimMonad m => MVar (PrimState m) a -> a -> m ()
putMVar :: forall (m :: * -> *) a.
PrimMonad m =>
MVar (PrimState m) a -> a -> m ()
putMVar (MVar MVar# (PrimState m) a
mvar#) a
x = (State# (PrimState m) -> State# (PrimState m)) -> m ()
forall (m :: * -> *).
PrimMonad m =>
(State# (PrimState m) -> State# (PrimState m)) -> m ()
primitive_ (MVar# (PrimState m) a
-> a -> State# (PrimState m) -> State# (PrimState m)
forall d a. MVar# d a -> a -> State# d -> State# d
putMVar# MVar# (PrimState m) a
mvar# a
x)
tryTakeMVar :: PrimMonad m => MVar (PrimState m) a -> m (Maybe a)
tryTakeMVar :: forall (m :: * -> *) a.
PrimMonad m =>
MVar (PrimState m) a -> m (Maybe a)
tryTakeMVar (MVar MVar# (PrimState m) a
m) = (State# (PrimState m) -> (# State# (PrimState m), Maybe a #))
-> m (Maybe a)
forall a.
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
forall (m :: * -> *) a.
PrimMonad m =>
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
primitive ((State# (PrimState m) -> (# State# (PrimState m), Maybe a #))
-> m (Maybe a))
-> (State# (PrimState m) -> (# State# (PrimState m), Maybe a #))
-> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ \ State# (PrimState m)
s ->
case MVar# (PrimState m) a
-> State# (PrimState m) -> (# State# (PrimState m), Int#, a #)
forall d a. MVar# d a -> State# d -> (# State# d, Int#, a #)
tryTakeMVar# MVar# (PrimState m) a
m State# (PrimState m)
s of
(# State# (PrimState m)
s', Int#
0#, a
_ #) -> (# State# (PrimState m)
s', Maybe a
forall a. Maybe a
Nothing #)
(# State# (PrimState m)
s', Int#
_, a
a #) -> (# State# (PrimState m)
s', a -> Maybe a
forall a. a -> Maybe a
Just a
a #)
tryPutMVar :: PrimMonad m => MVar (PrimState m) a -> a -> m Bool
tryPutMVar :: forall (m :: * -> *) a.
PrimMonad m =>
MVar (PrimState m) a -> a -> m Bool
tryPutMVar (MVar MVar# (PrimState m) a
mvar#) a
x = (State# (PrimState m) -> (# State# (PrimState m), Bool #))
-> m Bool
forall a.
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
forall (m :: * -> *) a.
PrimMonad m =>
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
primitive ((State# (PrimState m) -> (# State# (PrimState m), Bool #))
-> m Bool)
-> (State# (PrimState m) -> (# State# (PrimState m), Bool #))
-> m Bool
forall a b. (a -> b) -> a -> b
$ \ State# (PrimState m)
s# ->
case MVar# (PrimState m) a
-> a -> State# (PrimState m) -> (# State# (PrimState m), Int# #)
forall d a. MVar# d a -> a -> State# d -> (# State# d, Int# #)
tryPutMVar# MVar# (PrimState m) a
mvar# a
x State# (PrimState m)
s# of
(# State# (PrimState m)
s, Int#
0# #) -> (# State# (PrimState m)
s, Bool
False #)
(# State# (PrimState m)
s, Int#
_ #) -> (# State# (PrimState m)
s, Bool
True #)
tryReadMVar :: PrimMonad m => MVar (PrimState m) a -> m (Maybe a)
tryReadMVar :: forall (m :: * -> *) a.
PrimMonad m =>
MVar (PrimState m) a -> m (Maybe a)
tryReadMVar (MVar MVar# (PrimState m) a
m) = (State# (PrimState m) -> (# State# (PrimState m), Maybe a #))
-> m (Maybe a)
forall a.
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
forall (m :: * -> *) a.
PrimMonad m =>
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
primitive ((State# (PrimState m) -> (# State# (PrimState m), Maybe a #))
-> m (Maybe a))
-> (State# (PrimState m) -> (# State# (PrimState m), Maybe a #))
-> m (Maybe a)
forall a b. (a -> b) -> a -> b
$ \ State# (PrimState m)
s ->
case MVar# (PrimState m) a
-> State# (PrimState m) -> (# State# (PrimState m), Int#, a #)
forall d a. MVar# d a -> State# d -> (# State# d, Int#, a #)
tryReadMVar# MVar# (PrimState m) a
m State# (PrimState m)
s of
(# State# (PrimState m)
s', Int#
0#, a
_ #) -> (# State# (PrimState m)
s', Maybe a
forall a. Maybe a
Nothing #)
(# State# (PrimState m)
s', Int#
_, a
a #) -> (# State# (PrimState m)
s', a -> Maybe a
forall a. a -> Maybe a
Just a
a #)
isEmptyMVar :: PrimMonad m => MVar (PrimState m) a -> m Bool
isEmptyMVar :: forall (m :: * -> *) a.
PrimMonad m =>
MVar (PrimState m) a -> m Bool
isEmptyMVar (MVar MVar# (PrimState m) a
mv#) = (State# (PrimState m) -> (# State# (PrimState m), Bool #))
-> m Bool
forall a.
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
forall (m :: * -> *) a.
PrimMonad m =>
(State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
primitive ((State# (PrimState m) -> (# State# (PrimState m), Bool #))
-> m Bool)
-> (State# (PrimState m) -> (# State# (PrimState m), Bool #))
-> m Bool
forall a b. (a -> b) -> a -> b
$ \ State# (PrimState m)
s# ->
case MVar# (PrimState m) a
-> State# (PrimState m) -> (# State# (PrimState m), Int# #)
forall d a. MVar# d a -> State# d -> (# State# d, Int# #)
isEmptyMVar# MVar# (PrimState m) a
mv# State# (PrimState m)
s# of
(# State# (PrimState m)
s2#, Int#
flg #) -> (# State# (PrimState m)
s2#, Int# -> Bool
isTrue# (Int#
flg Int# -> Int# -> Int#
/=# Int#
0#) #)