module Control.Monad.Primitive ( PrimMonad(..), primitive_ ) where
import GHC.Prim ( State#, RealWorld )
import GHC.IOBase ( IO(..) )
import GHC.ST ( ST(..) )
class Monad m => PrimMonad m where
type PrimState m
primitive :: (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a
primitive_ :: PrimMonad m
=> (State# (PrimState m) -> State# (PrimState m)) -> m ()
primitive_ f = primitive (\s# -> (# f s#, () #))
instance PrimMonad IO where
type PrimState IO = RealWorld
primitive = IO
instance PrimMonad (ST s) where
type PrimState (ST s) = s
primitive = ST