packages feed

effect-monad-0.8.1.0: examples/Reader.hs

{-# LANGUAGE ImplicitParams, DataKinds, RebindableSyntax, TypeOperators, ScopedTypeVariables, FlexibleContexts #-}
import Prelude hiding (Monad(..))
import Control.Effect
import Control.Effect.Reader

import Data.Type.Map

import GHC.TypeLits

{- Examples -}

-- example :: Reader '["x" :-> a, "xs" :-> [a]] [a]
example = do
  x  <- ask (Var::(Var "x"))
  xs <- ask (Var::(Var "xs"))
  x' <- ask (Var::(Var "x"))
  return (x:x':xs)

init1 = Ext Var 1 (Ext Var [2, 3] Empty)
runExample = runReader example init1

-- Examples with subeffecting (need to refine the types a bit to 'run')

example' :: (Submap '["x" :-> Int, "xs" :-> [Int]] t) => Reader t [Int]
example' = sub example


init2 :: Map '["x" :-> Int, "xs" :-> [Int], "z" :-> a]
init2 =  Ext Var 1 (Ext Var [2, 3] (Ext Var undefined Empty))
runExample' = runReader example' init2