packages feed

effect-monad-0.8.0.0: examples/ExtensibleState.hs

{-# LANGUAGE RebindableSyntax #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleContexts #-}

import Prelude hiding (Monad(..))
import Control.Effect.Parameterised
import Control.Effect.Parameterised.ExtensibleState
import GHC.TypeLits
import Data.Type.Map

-- Example map
exMap :: Map '["x" ':-> Int, "flag" ':-> Bool]
exMap = Ext (Var @ "x") (42 :: Int)
      $ Ext (Var @ "flag") False
        Empty

increment :: (Update "x" Int m) => State (Map m) (Map m) ()
increment = do
   (n :: Int) <- get (Var @ "x")
   put (Var @ "x") (n+1)

example = do
   flag <- get (Var @ "flag")
   increment
   (n :: Int) <- get (Var @"x")
   put (Var @ "flag") ((n > 0) || flag)


go :: ((), Map '["x" ':-> Int, "flag" ':-> Bool])
go = runState example exMap

example2 :: (Get "flag" Bool m, Update "x" Int m, Put "y" Int m m) => State (Map m) (Map m) ()
example2 = do
   flag <- get (Var @ "flag")
   if flag
     then modify (Var @ "x") (\(x :: Int) -> x + 1)
     else put (Var @ "y") (42 :: Int)