#if __GLASGOW_HASKELL__ >= 702
#endif
module Control.Monad.StateVar (
HasGet(..),
HasPut(..),
put',
modify,
modify',
swap,
($=),
($~),
($=!),
($~!),
) where
import Control.Monad.Trans.Class
import GHC.Conc (STM, TVar, readTVar, writeTVar)
import Data.IORef
#if MIN_VERSION_base(4,4,0)
import qualified Control.Monad.ST.Safe as S
import qualified Control.Monad.ST.Lazy.Safe as L
#else
import qualified Control.Monad.ST as S
import qualified Control.Monad.ST.Lazy as L
#endif
import Data.STRef (STRef)
import qualified Data.STRef as S
import qualified Data.STRef.Lazy as L
class HasGet m v where
get :: v a -> m a
class HasPut m v where
put :: v a -> a -> m ()
instance (HasGet m v, MonadTrans t, Monad m) => HasGet (t m) v where
get v = lift $ get v
instance (HasPut m v, MonadTrans t, Monad m) => HasPut (t m) v where
put v a = lift $ put v a
instance HasGet IO IORef where
get = readIORef
instance HasPut IO IORef where
put = writeIORef
instance HasGet STM TVar where
get = readTVar
instance HasPut STM TVar where
put = writeTVar
instance HasGet (S.ST s) (STRef s) where
get = S.readSTRef
instance HasPut (S.ST s) (STRef s) where
put = S.writeSTRef
instance HasGet (L.ST s) (STRef s) where
get = L.readSTRef
instance HasPut (L.ST s) (STRef s) where
put = L.writeSTRef
put' :: HasPut m v => v a -> a -> m ()
put' v x = x `seq` put v x
modify :: (HasGet m v, HasPut m v, Monad m) => v a -> (a -> a) -> m ()
modify v f = get v >>= put v . f
modify' :: (HasGet m v, HasPut m v, Monad m) => v a -> (a -> a) -> m ()
modify' v f = do
x <- get v
put v $! f x
swap :: (HasGet m v, HasPut m v, Monad m) => v a -> a -> m a
swap var new = do
old <- get var
put var new
return old
infixr 2 $=
infixr 2 $~
infixr 2 $=!
infixr 2 $~!
($=) :: HasPut m v => v a -> a -> m ()
($=) = put
($=!) :: HasPut m v => v a -> a -> m ()
($=!) = put'
($~) :: (HasGet m v, HasPut m v, Monad m) => v a -> (a -> a) -> m ()
($~) = modify
($~!) :: (HasGet m v, HasPut m v, Monad m) => v a -> (a -> a) -> m ()
($~!) = modify'