cleff-0.1.0.0: test/InterposeSpec.hs
module InterposeSpec where
import Cleff
import Cleff.Output
import Cleff.Reader
import Cleff.State
import Cleff.Trace
import Test.Hspec
annoy :: ∀ es. '[Reader Int, Trace] :>> es => Eff es ~> Eff es
annoy = interpose @(Reader Int) h
where
h :: Handler (Reader Int) es
h = \case
Ask -> do
x <- ask
trace $ show x
pure x
Local f m -> local f (toEff m)
countdown :: Reader Int :> es => Eff es ()
countdown = do
x <- asks (== (0 :: Int))
if x then pure () else local (subtract (1 :: Int)) countdown
spec :: Spec
spec = do
it "should thread in effect environment correctly" do
let (_, msgs) = runPure $ runState [] $ outputToListState $ traceToOutput $ runReader (100 :: Int) $ annoy countdown
msgs `shouldBe` map show [0..100 :: Int]