polysemy-zoo-0.6.0.0: test/RevStateSpec.hs
{-# LANGUAGE RecursiveDo #-}
module RevStateSpec where
import Test.Hspec
import Data.Functor.Identity
import Polysemy
import Polysemy.State
import Polysemy.RevState
import Polysemy.EndState
import Polysemy.Fixpoint
runStateCircular :: (Member (State s) r, Member Fixpoint r)
=> Sem (RevState s ': r) a
-> Sem r (s, a)
runStateCircular sem = runEndState $ do
s <- getEndState
raise $ runRevState s sem
test :: String
test =
fst
. snd
. runIdentity
. runFinal
. fixpointToFinal
. runState ""
. runStateCircular
$ do
modify (++"time ")
revModify (++"circle")
modify (++"is ")
revModify (++"flat ")
modify (++"a ")
spec :: Spec
spec = do
describe "runRevState" $ do
it "should thread state backwards \
\and work together with EndState" $
test `shouldBe` "time is a flat circle"