module Control.Concurrent.Classy.STM.TVar
(
TVar
, newTVar
, newTVarN
, readTVar
, readTVarConc
, writeTVar
, modifyTVar
, modifyTVar'
, stateTVar
, swapTVar
, registerDelay
) where
import Control.Monad.Conc.Class
import Control.Monad.STM.Class
import Data.Functor (void)
modifyTVar :: MonadSTM stm => TVar stm a -> (a -> a) -> stm ()
modifyTVar :: forall (stm :: * -> *) a.
MonadSTM stm =>
TVar stm a -> (a -> a) -> stm ()
modifyTVar TVar stm a
ctvar a -> a
f = do
a
a <- TVar stm a -> stm a
forall a. TVar stm a -> stm a
forall (stm :: * -> *) a. MonadSTM stm => TVar stm a -> stm a
readTVar TVar stm a
ctvar
TVar stm a -> a -> stm ()
forall a. TVar stm a -> a -> stm ()
forall (stm :: * -> *) a. MonadSTM stm => TVar stm a -> a -> stm ()
writeTVar TVar stm a
ctvar (a -> stm ()) -> a -> stm ()
forall a b. (a -> b) -> a -> b
$ a -> a
f a
a
modifyTVar' :: MonadSTM stm => TVar stm a -> (a -> a) -> stm ()
modifyTVar' :: forall (stm :: * -> *) a.
MonadSTM stm =>
TVar stm a -> (a -> a) -> stm ()
modifyTVar' TVar stm a
ctvar a -> a
f = do
a
a <- TVar stm a -> stm a
forall a. TVar stm a -> stm a
forall (stm :: * -> *) a. MonadSTM stm => TVar stm a -> stm a
readTVar TVar stm a
ctvar
TVar stm a -> a -> stm ()
forall a. TVar stm a -> a -> stm ()
forall (stm :: * -> *) a. MonadSTM stm => TVar stm a -> a -> stm ()
writeTVar TVar stm a
ctvar (a -> stm ()) -> a -> stm ()
forall a b. (a -> b) -> a -> b
$! a -> a
f a
a
stateTVar :: MonadSTM stm => TVar stm s -> (s -> (a, s)) -> stm a
stateTVar :: forall (stm :: * -> *) s a.
MonadSTM stm =>
TVar stm s -> (s -> (a, s)) -> stm a
stateTVar TVar stm s
var s -> (a, s)
f = do
s
s <- TVar stm s -> stm s
forall a. TVar stm a -> stm a
forall (stm :: * -> *) a. MonadSTM stm => TVar stm a -> stm a
readTVar TVar stm s
var
let (a
a, s
s') = s -> (a, s)
f s
s
TVar stm s -> s -> stm ()
forall a. TVar stm a -> a -> stm ()
forall (stm :: * -> *) a. MonadSTM stm => TVar stm a -> a -> stm ()
writeTVar TVar stm s
var s
s'
a -> stm a
forall a. a -> stm a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
a
swapTVar :: MonadSTM stm => TVar stm a -> a -> stm a
swapTVar :: forall (stm :: * -> *) a. MonadSTM stm => TVar stm a -> a -> stm a
swapTVar TVar stm a
ctvar a
a = do
a
old <- TVar stm a -> stm a
forall a. TVar stm a -> stm a
forall (stm :: * -> *) a. MonadSTM stm => TVar stm a -> stm a
readTVar TVar stm a
ctvar
TVar stm a -> a -> stm ()
forall a. TVar stm a -> a -> stm ()
forall (stm :: * -> *) a. MonadSTM stm => TVar stm a -> a -> stm ()
writeTVar TVar stm a
ctvar a
a
a -> stm a
forall a. a -> stm a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a
old
registerDelay :: MonadConc m => Int -> m (TVar (STM m) Bool)
registerDelay :: forall (m :: * -> *). MonadConc m => Int -> m (TVar (STM m) Bool)
registerDelay Int
delay = do
TVar (STM m) Bool
var <- STM m (TVar (STM m) Bool) -> m (TVar (STM m) Bool)
forall a. STM m a -> m a
forall (m :: * -> *) a. MonadConc m => STM m a -> m a
atomically (Bool -> STM m (TVar (STM m) Bool)
forall a. a -> STM m (TVar (STM m) a)
forall (stm :: * -> *) a. MonadSTM stm => a -> stm (TVar stm a)
newTVar Bool
False)
m (ThreadId m) -> m ()
forall (f :: * -> *) a. Functor f => f a -> f ()
void (m (ThreadId m) -> m ())
-> (m () -> m (ThreadId m)) -> m () -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. m () -> m (ThreadId m)
forall (m :: * -> *). MonadConc m => m () -> m (ThreadId m)
fork (m () -> m ()) -> m () -> m ()
forall a b. (a -> b) -> a -> b
$ do
Int -> m ()
forall (m :: * -> *). MonadConc m => Int -> m ()
threadDelay Int
delay
STM m () -> m ()
forall a. STM m a -> m a
forall (m :: * -> *) a. MonadConc m => STM m a -> m a
atomically (TVar (STM m) Bool -> Bool -> STM m ()
forall a. TVar (STM m) a -> a -> STM m ()
forall (stm :: * -> *) a. MonadSTM stm => TVar stm a -> a -> stm ()
writeTVar TVar (STM m) Bool
var Bool
True)
TVar (STM m) Bool -> m (TVar (STM m) Bool)
forall a. a -> m a
forall (f :: * -> *) a. Applicative f => a -> f a
pure TVar (STM m) Bool
var