packages feed

has-transformers-0.1.0.0: examples/Examples/StateSig.hs

module Examples.StateSig where

import "base" Control.Monad (when)

import "operational" Control.Monad.Operational

import "has-transformers" Control.Monad.Trans.Has
import "has-transformers" Control.Monad.Trans.Has.State

data StateSig s a where
  Put :: s -> StateSig s ()
  Get :: StateSig s s

type StateSigT s m a = ProgramT (StateSig s) m a

type HasStateSig s m = Has (ProgramT (StateSig s)) m

putS :: HasStateSig s m => s -> m ()
-- putS = liftH . singleton . Put
putS s = liftH $ singleton $ Put s

getS :: HasStateSig s m => m s
getS = liftH $ singleton Get

program :: (HasStateSig Bool m, Monad m) => m ()
program = do
  b <- getS
  when b $ putS False

interpretStateSig :: HasState s m => StateSig s a -> m a
interpretStateSig (Put s) = put s
interpretStateSig Get = get

interpretStateSigT :: (HasState s m, Monad m) => StateSigT s m a -> m a
interpretStateSigT = interpretWithMonadT interpretStateSig