module Manatee.Toolkit.General.State where
import Control.Concurrent.STM
import Control.Monad.State
import Manatee.Toolkit.General.STM
modifyM :: (Monad m, MonadTrans t, MonadState a (t m)) => (a -> m a) -> t m ()
modifyM f = do
oldState <- get
newState <- lift $ f oldState
put newState
modifyM_ :: (Monad m, MonadTrans t, MonadState a1 (t m)) => (a1 -> m a) -> (a -> a1) -> (a -> a2) -> t m a2
modifyM_ f g h = do
oldState <- get
newState <- lift $ f oldState
put $ g newState
return $ h newState
modifyM' :: (Monad m, MonadTrans t, MonadState a1 (t m)) => (a1 -> m a) -> (a -> a1) -> t m ()
modifyM' f g = do
oldState <- get
newState <- lift $ f oldState
put $ g newState
modifyFst :: (MonadState (t, t1) m) => ((t, t1) -> t) -> m ()
modifyFst f = do
oldState@(_, b) <- get
put (f oldState, b)
modifySnd :: (MonadState (t, t1) m) => ((t, t1) -> t1) -> m ()
modifySnd f = do
oldState@(a, _) <- get
put (a, f oldState)
modifyFstM :: (Monad m, MonadTrans t1, MonadState (a, t) (t1 m)) => ((a, t) -> m a) -> t1 m ()
modifyFstM f = do
oldState@(_, b) <- get
a' <- lift $ f oldState
put (a', b)
modifySndM :: (Monad m, MonadTrans t1, MonadState (t, a) (t1 m)) => ((t, a) -> m a) -> t1 m ()
modifySndM f = do
oldState@(a, _) <- get
b' <- lift $ f oldState
put (a, b')
getM :: (MonadState a (t m), MonadTrans t, Monad m) => (a -> m a1) -> t m a1
getM f = get >>= lift . f
runStateT_ :: b -> StateT b m a -> m (a, b)
runStateT_ = flip runStateT
runStateT' :: (Functor f) => b -> StateT b f a -> f b
runStateT' b f = fmap snd $ runStateT_ b f
runTVarStateT :: TVar a -> (a -> StateT a IO b) -> IO ()
runTVarStateT tvar fun = do
state <- readTVarIO tvar
newState <- runStateT' state (fun state)
writeTVarIO tvar newState
runTVarTupeStateT :: (TVar a, TVar b) -> (a -> b -> StateT (a, b) IO c) -> IO ()
runTVarTupeStateT (tvarA, tvarB) fun = do
stateA <- readTVarIO tvarA
stateB <- readTVarIO tvarB
(newStateA, newStateB) <- runStateT' (stateA, stateB) (fun stateA stateB)
writeTVarIO tvarA newStateA
writeTVarIO tvarB newStateB