packages feed

effectful-core-2.6.1.0: src/Effectful/Fail.hs

-- | Provider of the 'MonadFail' instance for 'Eff'.
module Effectful.Fail
  ( -- * Effect
    Fail(..)

    -- ** Handlers
  , runFail
  , runFailIO
  ) where

import Effectful
import Effectful.Dispatch.Dynamic
import Effectful.Error.Static
import Effectful.Internal.Monad (Fail(..))

-- | Run the 'Fail' effect via 'Error'.
runFail :: HasCallStack => Eff (Fail : es) a -> Eff es (Either String a)
runFail = reinterpret_ runErrorNoCallStack $ \case
  Fail msg -> throwError msg

-- | Run the 'Fail' effect via the 'MonadFail' instance for 'IO'.
runFailIO :: (HasCallStack, IOE :> es) => Eff (Fail : es) a -> Eff es a
runFailIO = interpret_ $ \case
  Fail msg -> liftIO $ fail msg