-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Type class for monad transformers stack with pirimitive base monad.
--   
--   Type class for for monad transformers stack with pirimitive base monad
--   and mutable references whic could use either ST or IO monads.
@package monad-primitive
@version 0.1


module Control.Monad.Primitive.Class

-- | Monads in which computation based on primitive monad (instance of
--   <a>PrimMonad</a>) could be embedded. Instances must obey following
--   laws:
--   
--   <pre>
--   liftPrim . return  = return
--   liftPrim (m &gt;&gt;= f) = liftPrim m &gt;&gt;= liftPrim f
--   </pre>
class (PrimMonad (BasePrimMonad m), Monad m) => MonadPrim m where {
    type family BasePrimMonad m :: * -> *;
}
liftPrim :: MonadPrim m => BasePrimMonad m a -> m a
instance Control.Monad.Primitive.Class.MonadPrim GHC.Types.IO
instance Control.Monad.Primitive.Class.MonadPrim (GHC.ST.ST s)
instance Control.Monad.Primitive.Class.MonadPrim m => Control.Monad.Primitive.Class.MonadPrim (Control.Monad.Trans.Cont.ContT r m)
instance (Control.Monad.Primitive.Class.MonadPrim m, Control.Monad.Trans.Error.Error e) => Control.Monad.Primitive.Class.MonadPrim (Control.Monad.Trans.Error.ErrorT e m)
instance Control.Monad.Primitive.Class.MonadPrim m => Control.Monad.Primitive.Class.MonadPrim (Control.Monad.Trans.Identity.IdentityT m)
instance Control.Monad.Primitive.Class.MonadPrim m => Control.Monad.Primitive.Class.MonadPrim (Control.Monad.Trans.Maybe.MaybeT m)
instance Control.Monad.Primitive.Class.MonadPrim m => Control.Monad.Primitive.Class.MonadPrim (Control.Monad.Trans.Reader.ReaderT r m)
instance (Control.Monad.Primitive.Class.MonadPrim m, GHC.Base.Monoid w) => Control.Monad.Primitive.Class.MonadPrim (Control.Monad.Trans.RWS.Strict.RWST r w s m)
instance (Control.Monad.Primitive.Class.MonadPrim m, GHC.Base.Monoid w) => Control.Monad.Primitive.Class.MonadPrim (Control.Monad.Trans.RWS.Lazy.RWST r w s m)
instance Control.Monad.Primitive.Class.MonadPrim m => Control.Monad.Primitive.Class.MonadPrim (Control.Monad.Trans.State.Strict.StateT s m)
instance Control.Monad.Primitive.Class.MonadPrim m => Control.Monad.Primitive.Class.MonadPrim (Control.Monad.Trans.State.Lazy.StateT s m)
instance (Control.Monad.Primitive.Class.MonadPrim m, GHC.Base.Monoid w) => Control.Monad.Primitive.Class.MonadPrim (Control.Monad.Trans.Writer.Strict.WriterT w m)
instance (Control.Monad.Primitive.Class.MonadPrim m, GHC.Base.Monoid w) => Control.Monad.Primitive.Class.MonadPrim (Control.Monad.Trans.Writer.Lazy.WriterT w m)


-- | Mutable references in monads which are instances of
--   <tt>MonadPrim</tt>.
module Data.PrimRef

-- | Mutable variable which full analog of <a>IORef</a> or <a>STRef</a> but
--   could use either of the monads. Unfortunately there's no way to
--   convert <tt>PrimRef</tt> to <tt>STRef</tt> or <tt>IORef</tt>.
data PrimRef m a

-- | Create new mutable variable with initial value <tt>a</tt>.
newPrimRef :: PrimMonad m => a -> m (PrimRef m a)

-- | Read value of <tt>PrimRef</tt>.
readPrimRef :: PrimMonad m => PrimRef m a -> m a

-- | Write value to <tt>PrimRef</tt>.
writePrimRef :: PrimMonad m => PrimRef m a -> a -> m ()

-- | Modify content of <tt>PrimRef</tt> using function.
modifyPrimRef :: PrimMonad m => PrimRef m a -> (a -> a) -> m ()

-- | Modify content of <tt>PrimRef</tt> using function and evaluate result
--   of function application to WHNF before storing it in the variable.
modifyPrimRef' :: PrimMonad m => PrimRef m a -> (a -> a) -> m ()
