module Control.Monad.Trans.Has.State
  ( module Control.Monad.Trans.Has.State
  , module X
  ) where

import "transformers" Control.Monad.Trans.State.Strict
  qualified as State
import "transformers" Control.Monad.Trans.State.Strict
  as X (StateT(..))

import "this" Control.Monad.Trans.Has

type HasState s m = Has (StateT s) m

get :: HasState s m => m s
get :: m s
get = (forall (n :: * -> *). Monad n => StateT s n s) -> m s
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
Has t m =>
(forall (n :: * -> *). Monad n => t n a) -> m a
liftH forall (n :: * -> *). Monad n => StateT s n s
forall (m :: * -> *) s. Monad m => StateT s m s
State.get

put :: HasState s m => s -> m ()
put :: s -> m ()
put s
s = (forall (n :: * -> *). Monad n => StateT s n ()) -> m ()
forall (t :: (* -> *) -> * -> *) (m :: * -> *) a.
Has t m =>
(forall (n :: * -> *). Monad n => t n a) -> m a
liftH ((forall (n :: * -> *). Monad n => StateT s n ()) -> m ())
-> (forall (n :: * -> *). Monad n => StateT s n ()) -> m ()
forall a b. (a -> b) -> a -> b
$ s -> StateT s n ()
forall (m :: * -> *) s. Monad m => s -> StateT s m ()
State.put s
s