{-# LANGUAGE InstanceSigs #-} module Control.Effect.Parameterised.State where -- Bye Monads... as we know them import Prelude hiding (Monad(..)) import Control.Effect.Parameterised newtype State s1 s2 a = State { runState :: s1 -> (a, s2) } -- State parameterised monad -- ... just like the instance PMonad State where return :: a -> State s s a return x = State (\s -> (x, s)) (>>=) :: State s1 s2 a -> (a -> State s2 s3 b) -> State s1 s3 b (State m) >>= k = State $ \s0 -> let (a, s1) = m s0 State m' = k a in m' s1