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