packages feed

polysemy-1.1.0.0: test/FailSpec.hs

module FailSpec where

import Polysemy
import Polysemy.Fail
import Polysemy.NonDet
import Test.Hspec
import Control.Applicative

semFail :: Member Fail r => Maybe Bool -> Sem r Bool
semFail mb = do
  Just b <- pure mb
  pure b

runAlt :: Alternative f => Sem '[Fail, NonDet] a -> f a
runAlt = run . runNonDet . failToNonDet

spec :: Spec
spec = parallel $ do
  describe "MonadFail instance with failToNonDet" $ do
    it "should call empty via fail" $ do
      runAlt (semFail Nothing) `shouldBe` Nothing
      runAlt (semFail Nothing) `shouldBe` []
    it "should work fine for non-failing patterns" $ do
      runAlt (semFail $ Just True) `shouldBe` Just True
      runAlt (semFail $ Just False) `shouldBe` [False]