effect-monad-0.6.1: examples/State.hs
{-# LANGUAGE DataKinds, RebindableSyntax, TypeOperators, FlexibleInstances #-}
import Prelude hiding (Monad(..))
import Control.Effect
import Control.Effect.State
x_var = Var::(Var "x")
y_var = Var::(Var "y")
{- Computation with a read effect on variable "x" and a read-write (update) effect on variable "y" -}
-- foo :: State '["x" :-> Int :! R, "y" :-> [Int] :! RW] [Int]
foo = do x <- get x_var
y <- get y_var
put y_var (x:y)
z <- get y_var
return (x:z)
foo_run = runState foo (Ext (x_var :-> (1 :! Eff)) (Ext (y_var :-> ([2,3] :! Eff)) Empty))
--foo2 :: State '["x" :-> Int :! RW] Int
foo2 = do x <- get (Var::(Var "x"))
put (Var::(Var "x")) (x+1)
return x
foo2_run = (runState foo2) (Ext (x_var :-> 10 :! Eff) Empty)