content: {- | An effect modelling catchable failure when used with 'Control.Effect.Throw.Throw'.
  
  Predefined carriers:
  
  * "Control.Carrier.Error.Either" (with 'Control.Effect.Throw.Throw')
  
  @since 1.0.0.0
  -}
  module Control.Effect.Catch
  ( -- * Catch effect
    Catch(..)
  , catchError
    -- * Re-exports
  , Algebra
  , Has
  , run
  ) where
  
  import Control.Algebra
  import Control.Effect.Catch.Internal (Catch(..))
  
  -- | Run a computation which can throw errors with a handler to run on error.
  --
  -- Errors thrown by the handler will escape up to the nearest enclosing 'catchError' (if any). Note that this effect does /not/ handle errors thrown from impure contexts such as IO, nor will it handle exceptions thrown from pure code. If you need to handle IO-based errors, consider if @fused-effects-exceptions@ fits your use case; if not, use 'Control.Monad.IO.Class.liftIO' with 'Control.Exception.try' or use 'Control.Exception.catch' from outside the effect invocation.
  --
  -- @
  -- runError ('Control.Effect.Throw.throwError' e `catchError` f) = runError (f e)
  -- @
  --
  -- @since 0.1.0.0
  catchError :: Has (Catch e) sig m => m a -> (e -> m a) -> m a
  catchError m h = send (Catch m h)
  {-# INLINE catchError #-}
  