{-# LANGUAGE
BangPatterns,
GADTs,
KindSignatures,
RankNTypes,
ScopedTypeVariables,
StandaloneKindSignatures,
TypeOperators #-}
module Bluefin.Algae.Exception
(
Exception(..)
, throw
, catch
, try
, catch'
, try'
) where
import Data.Kind (Type)
import Bluefin.Eff (Eff, type (:&), type (:>))
import Bluefin.Algae
data Exception (e :: Type) :: AEffect where
Throw :: e -> Exception e r
throw :: z :> zz => Handler (Exception e) z -> e -> Eff zz a
throw :: forall (z :: Effects) (zz :: Effects) e a.
(z :> zz) =>
Handler (Exception e) z -> e -> Eff zz a
throw Handler (Exception e) z
h e
e = Handler (Exception e) z -> Exception e a -> Eff zz a
forall (s :: Effects) (ss :: Effects) (f :: AEffect) a.
(s :> ss) =>
Handler f s -> f a -> Eff ss a
call Handler (Exception e) z
h (e -> Exception e a
forall e r. e -> Exception e r
Throw e
e)
catch' :: forall e a zz.
(forall z. Handler (Exception e) z -> Eff (z :& zz) a) ->
(e -> Eff zz a) ->
Eff zz a
catch' :: forall e a (zz :: Effects).
(forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a)
-> (e -> Eff zz a) -> Eff zz a
catch' forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a
f e -> Eff zz a
h = HandlerBody (Exception e) zz a
-> (forall (z :: Effects).
Handler (Exception e) z -> Eff (z :& zz) a)
-> Eff zz a
forall (f :: AEffect) (ss :: Effects) a.
HandlerBody f ss a -> ScopedEff f ss a -> Eff ss a
handle Exception e x -> (x -> Eff zz a) -> Eff zz a
HandlerBody (Exception e) zz a
exceptionHandler Handler (Exception e) s -> Eff (s :& zz) a
forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a
f
where
exceptionHandler :: HandlerBody (Exception e) zz a
exceptionHandler :: HandlerBody (Exception e) zz a
exceptionHandler (Throw e
e) x -> Eff zz a
_ = e -> Eff zz a
h e
e
try' :: forall e a zz.
(forall z. Handler (Exception e) z -> Eff (z :& zz) a) ->
Eff zz (Either e a)
try' :: forall e a (zz :: Effects).
(forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a)
-> Eff zz (Either e a)
try' forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a
f = (forall (z :: Effects).
Handler (Exception e) z -> Eff (z :& zz) (Either e a))
-> (e -> Eff zz (Either e a)) -> Eff zz (Either e a)
forall e a (zz :: Effects).
(forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a)
-> (e -> Eff zz a) -> Eff zz a
catch' ((a -> Either e a) -> Eff (z :& zz) a -> Eff (z :& zz) (Either e a)
forall a b. (a -> b) -> Eff (z :& zz) a -> Eff (z :& zz) b
forall (f :: AEffect) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Either e a
forall a b. b -> Either a b
Right (Eff (z :& zz) a -> Eff (z :& zz) (Either e a))
-> (Handler (Exception e) z -> Eff (z :& zz) a)
-> Handler (Exception e) z
-> Eff (z :& zz) (Either e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Handler (Exception e) z -> Eff (z :& zz) a
forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a
f) (Either e a -> Eff zz (Either e a)
forall a. a -> Eff zz a
forall (f :: AEffect) a. Applicative f => a -> f a
pure (Either e a -> Eff zz (Either e a))
-> (e -> Either e a) -> e -> Eff zz (Either e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> Either e a
forall a b. a -> Either a b
Left)
catch :: forall e a zz.
(forall z. Handler (Exception e) z -> Eff (z :& zz) a) ->
(e -> Eff zz a) ->
Eff zz a
catch :: forall e a (zz :: Effects).
(forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a)
-> (e -> Eff zz a) -> Eff zz a
catch forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a
f e -> Eff zz a
h = HandlerBody' (Exception e) zz a
-> (forall (z :: Effects).
Handler (Exception e) z -> Eff (z :& zz) a)
-> Eff zz a
forall (f :: AEffect) (ss :: Effects) a.
HandlerBody' f ss a -> ScopedEff f ss a -> Eff ss a
handle' Exception e x -> Continuation ss0 zz x a -> Eff zz a
HandlerBody' (Exception e) zz a
exceptionHandler Handler (Exception e) s -> Eff (s :& zz) a
forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a
f
where
exceptionHandler :: HandlerBody' (Exception e) zz a
exceptionHandler :: HandlerBody' (Exception e) zz a
exceptionHandler (Throw e
e) Continuation ss0 zz x a
k = Continuation ss0 zz x a -> Eff zz ()
forall (t :: Effects) (s :: Effects) b a.
Continuation t s b a -> Eff s ()
cancel Continuation ss0 zz x a
k Eff zz () -> Eff zz a -> Eff zz a
forall a b. Eff zz a -> Eff zz b -> Eff zz b
forall (m :: AEffect) a b. Monad m => m a -> m b -> m b
>> e -> Eff zz a
h e
e
try :: forall e a zz.
(forall z. Handler (Exception e) z -> Eff (z :& zz) a) ->
Eff zz (Either e a)
try :: forall e a (zz :: Effects).
(forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a)
-> Eff zz (Either e a)
try forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a
f = (forall (z :: Effects).
Handler (Exception e) z -> Eff (z :& zz) (Either e a))
-> (e -> Eff zz (Either e a)) -> Eff zz (Either e a)
forall e a (zz :: Effects).
(forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a)
-> (e -> Eff zz a) -> Eff zz a
catch ((a -> Either e a) -> Eff (z :& zz) a -> Eff (z :& zz) (Either e a)
forall a b. (a -> b) -> Eff (z :& zz) a -> Eff (z :& zz) b
forall (f :: AEffect) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Either e a
forall a b. b -> Either a b
Right (Eff (z :& zz) a -> Eff (z :& zz) (Either e a))
-> (Handler (Exception e) z -> Eff (z :& zz) a)
-> Handler (Exception e) z
-> Eff (z :& zz) (Either e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Handler (Exception e) z -> Eff (z :& zz) a
forall (z :: Effects). Handler (Exception e) z -> Eff (z :& zz) a
f) (Either e a -> Eff zz (Either e a)
forall a. a -> Eff zz a
forall (f :: AEffect) a. Applicative f => a -> f a
pure (Either e a -> Eff zz (Either e a))
-> (e -> Either e a) -> e -> Eff zz (Either e a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. e -> Either e a
forall a b. a -> Either a b
Left)