module Lift ( tests ) where import Control.Carrier.State.Strict import Control.Effect.Lift import qualified Control.Exception as E import Control.Monad.IO.Class import Gen import Hedgehog tests :: TestTree tests = testGroup "Lift" [ testProperty "liftWith" . property $ do r <- liftIO . runState "yep" $ handle (put . getMsg) $ do modify ("heck " ++) liftIO (E.throwIO (E.AssertionFailed "nope")) r === ("nope", ()) ] where getMsg (E.AssertionFailed msg) = msg handle :: (E.Exception e, Has (Lift IO) sig m) => (e -> m a) -> m a -> m a handle h m = liftWith $ \ run ctx -> E.handle (run . (<$ ctx) . h) (run (m <$ ctx))