module Manatee.Toolkit.General.STM where
import Control.Applicative hiding (empty)
import Control.Concurrent.STM
import Manatee.Toolkit.General.Basic
modifyTVar :: TVar a -> (a -> a) -> STM ()
modifyTVar var f = do
x <- readTVar var
writeTVar var (f x)
modifyTVarIO :: TVar a -> (a -> a) -> IO ()
modifyTVarIO var f = atomically $ modifyTVar var f
replaceTVarField :: a -> a -> (a -> TVar b) -> IO ()
replaceTVarField old new field =
readTVarIO (field new) >>= writeTVarIO (field old)
modifyTVarIOM :: TVar a -> (a -> IO a) -> IO ()
modifyTVarIOM var f = do
oldVar <- readTVarIO var
newVar <- f oldVar
writeTVarIO var newVar
writeTVarIO :: TVar a -> a -> IO ()
writeTVarIO a b = atomically $ writeTVar a b
tickTVar :: TVar Int -> STM Int
tickTVar x = readTVar x << modifyTVar x succ
tickTVarIO :: TVar Int -> IO Int
tickTVarIO = atomically . tickTVar
crockTVar :: TVar Int -> STM Int
crockTVar x = readTVar x << modifyTVar x pred
crockTVarIO :: TVar Int -> IO Int
crockTVarIO = atomically . crockTVar
queryTVarIO :: TVar a -> (a -> b) -> IO b
queryTVarIO var f = f <$> readTVarIO var
dupTChanIO :: TChan a -> IO (TChan a)
dupTChanIO = atomically . dupTChan
readTChanIO :: TChan a -> IO a
readTChanIO = atomically . readTChan
writeTChanIO :: TChan a -> a -> IO ()
writeTChanIO tchan a = atomically $ writeTChan tchan a