freer-simple/tests/Tests/State.hs
2017-01-21 10:36:50 -06:00

40 lines
859 B
Haskell

{-# LANGUAGE FlexibleContexts #-}
module Tests.State (
testPutGet,
testPutGetPutGetPlus,
testGetStart,
testEvalState,
testExecState
) where
import Control.Monad.Freer
import Control.Monad.Freer.State
testPutGet :: Int -> Int -> (Int,Int)
testPutGet n start = run (runState go start)
where go = put n >> get
testPutGetPutGetPlus :: Int -> Int -> Int -> (Int,Int)
testPutGetPutGetPlus p1 p2 start = run (runState go start)
where go = do
put p1
x <- get
put p2
y <- get
return (x+y)
testGetStart :: Int -> (Int,Int)
testGetStart = run . runState get
testEvalState :: Int -> Int
testEvalState = run . evalState go
where
go = do
x <- get
-- destroy the previous state
put (0 :: Int)
return x
testExecState :: Int -> Int
testExecState n = run $ execState (put n) 0