effect-monad-0.7.0.0: 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" -}
-- example :: State '["x" :-> Int :! R, "y" :-> [Int] :! RW] [Int]
example = do
x <- get x_var
y <- get y_var
put y_var (x:y)
z <- get y_var
return (x:z)
initS = Ext (x_var :-> (1 :! Eff)) (Ext (y_var :-> ([2,3] :! Eff)) Empty)
example_run = runState example initS
--example2 :: State '["x" :-> Int :! RW] Int
example2 = do
x <- get (Var::(Var "x"))
put (Var::(Var "x")) (x+1)
return x
example2_run = (runState example2) (Ext (x_var :-> 10 :! Eff) Empty)
example3 :: State '["x" :-> String :! RW] ()
example3 = do
x <- get x_var
put x_var (x ++ " ok !")