module Effectful.Zoo.Core.Error.Dynamic
  ( Error,
    catch,
    catch_,
    throw,
    trap,
    trap_,

    catchWithCallStack,
    catchWithCallStack_,
    trapWithCallStack,
    trapWithCallStack_,
  ) where

import Effectful
import Effectful.Error.Dynamic (Error)
import Effectful.Error.Dynamic qualified as E
import Effectful.Zoo.Core
import HaskellWorks.Prelude

catchWithCallStack :: forall e es a. ()
  => HasCallStack
  => es <: Error e
  => Eff es a
  -> (CallStack -> e -> Eff es a)
  -> Eff es a
catchWithCallStack :: forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
Eff es a -> (CallStack -> e -> Eff es a) -> Eff es a
catchWithCallStack =
  Eff es a -> (CallStack -> e -> Eff es a) -> Eff es a
forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
Eff es a -> (CallStack -> e -> Eff es a) -> Eff es a
E.catchError

catchWithCallStack_ :: forall e es a. ()
  => HasCallStack
  => es <: Error e
  => Eff es a
  -> (CallStack -> Eff es a)
  -> Eff es a
catchWithCallStack_ :: forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
Eff es a -> (CallStack -> Eff es a) -> Eff es a
catchWithCallStack_ Eff es a
f CallStack -> Eff es a
h =
  forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
Eff es a -> (CallStack -> e -> Eff es a) -> Eff es a
catchWithCallStack @e Eff es a
f \CallStack
cs e
_ -> CallStack -> Eff es a
h CallStack
cs

trapWithCallStack :: forall e es a. ()
  => HasCallStack
  => es <: Error e
  => (CallStack -> e -> Eff es a)
  -> Eff es a
  -> Eff es a
trapWithCallStack :: forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
(CallStack -> e -> Eff es a) -> Eff es a -> Eff es a
trapWithCallStack =
  (Eff es a -> (CallStack -> e -> Eff es a) -> Eff es a)
-> (CallStack -> e -> Eff es a) -> Eff es a -> Eff es a
forall a b c. (a -> b -> c) -> b -> a -> c
flip Eff es a -> (CallStack -> e -> Eff es a) -> Eff es a
forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
Eff es a -> (CallStack -> e -> Eff es a) -> Eff es a
catchWithCallStack

trapWithCallStack_ :: forall e es a. ()
  => HasCallStack
  => es <: Error e
  => (CallStack -> Eff es a)
  -> Eff es a
  -> Eff es a
trapWithCallStack_ :: forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
(CallStack -> Eff es a) -> Eff es a -> Eff es a
trapWithCallStack_ CallStack -> Eff es a
h =
  forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
(CallStack -> e -> Eff es a) -> Eff es a -> Eff es a
trapWithCallStack @e (Eff es a -> e -> Eff es a
forall a b. a -> b -> a
const (Eff es a -> e -> Eff es a)
-> (CallStack -> Eff es a) -> CallStack -> e -> Eff es a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CallStack -> Eff es a
h)

catch :: forall e es a. ()
  => HasCallStack
  => es <: Error e
  => Eff es a
  -> (e -> Eff es a)
  -> Eff es a
catch :: forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
Eff es a -> (e -> Eff es a) -> Eff es a
catch Eff es a
action e -> Eff es a
handler =
  Eff es a -> (CallStack -> e -> Eff es a) -> Eff es a
forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
Eff es a -> (CallStack -> e -> Eff es a) -> Eff es a
catchWithCallStack Eff es a
action ((e -> Eff es a) -> CallStack -> e -> Eff es a
forall a b. a -> b -> a
const e -> Eff es a
handler)

catch_ :: forall e es a. ()
  => HasCallStack
  => es <: Error e
  => Eff es a
  -> Eff es a
  -> Eff es a
catch_ :: forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
Eff es a -> Eff es a -> Eff es a
catch_ Eff es a
action Eff es a
handler =
  forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
Eff es a -> (e -> Eff es a) -> Eff es a
catch @e Eff es a
action (Eff es a -> e -> Eff es a
forall a b. a -> b -> a
const Eff es a
handler)

throw :: forall e es a. ()
  => HasCallStack
  => es <: Error e
  => Show e
  => e
  -> Eff es a
throw :: forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e, Show e) =>
e -> Eff es a
throw =
  e -> Eff es a
forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e, Show e) =>
e -> Eff es a
E.throwError

trap :: forall e es a. ()
  => HasCallStack
  => es <: Error e
  => (e -> Eff es a)
  -> Eff es a
  -> Eff es a
trap :: forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
(e -> Eff es a) -> Eff es a -> Eff es a
trap =
  (Eff es a -> (e -> Eff es a) -> Eff es a)
-> (e -> Eff es a) -> Eff es a -> Eff es a
forall a b c. (a -> b -> c) -> b -> a -> c
flip Eff es a -> (e -> Eff es a) -> Eff es a
forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
Eff es a -> (e -> Eff es a) -> Eff es a
catch

trap_ :: forall e es a. ()
  => HasCallStack
  => es <: Error e
  => Eff es a
  -> Eff es a
  -> Eff es a
trap_ :: forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
Eff es a -> Eff es a -> Eff es a
trap_ Eff es a
handler =
  forall e (es :: [Effect]) a.
(HasCallStack, es <: Error e) =>
(e -> Eff es a) -> Eff es a -> Eff es a
trap @e (Eff es a -> e -> Eff es a
forall a b. a -> b -> a
const Eff es a
handler)