module Control.Effect.Parameterised.ExtensibleState
(State(..), Get, Put, Update, get, put, modify
, PMonad(..), (>>), ifThenElse, fail) where
import Prelude hiding (Monad(..))
import Control.Effect.Parameterised
import Control.Effect.Parameterised.State
import Data.Type.Map
get :: IsMember v t m => Var v -> State (Map m) (Map m) t
get v = State $ \s -> (lookp v s, s)
put :: Updatable v t m n => Var v -> t -> State (Map m) (Map n) ()
put v t = State $ \s -> ((), update s v t)
modify :: (IsMember v s m, Updatable v t m n) => Var v -> (s -> t) -> State (Map m) (Map n) ()
modify v f = do
x <- get v
put v (f x)
type Get v t m = IsMember v t m
type Put v t m n = Updatable v t m n
type Update v t m = (Get v t m, Put v t m m)