0 | module Control.Eff.Except
2 | import Control.Eff.Internal
7 | data ExceptL : (lbl : k) -> (err : Type) -> (a : Type) -> Type where
9 | Err : err -> ExceptL lbl err a
12 | Except : (err,a : Type) -> Type
16 | FailL : (lbl : k) -> (a : Type) -> Type
17 | FailL lbl = ExceptL lbl ()
20 | Fail : (a : Type) -> Type
24 | throwAt : (0 lbl : k) -> Has (ExceptL lbl err) fs => err -> Eff fs a
25 | throwAt lbl e = send $
Err {lbl} e
28 | throw : Has (Except err) fs => err -> Eff fs a
32 | failAt : (0 lbl : k) -> Has (FailL lbl) fs => Eff fs a
33 | failAt lbl = throwAt lbl ()
36 | fail : Has Fail fs => Eff fs a
37 | fail = throwAt () ()
40 | rethrowAt : (0 lbl : k) -> Has (ExceptL lbl err) fs => Either err a -> Eff fs a
41 | rethrowAt lbl = either (throwAt lbl) pure
44 | rethrow : Has (Except err) fs => Either err a -> Eff fs a
45 | rethrow = rethrowAt ()
50 | -> {auto _ : Has (ExceptL lbl err) fs}
54 | noteAt lbl e = maybe (throwAt lbl e) pure
57 | note : Has (Except err) fs => Lazy err -> Maybe a -> Eff fs a
61 | fromJustAt : (0 lbl : k) -> Has (FailL lbl) fs => Maybe a -> Eff fs a
62 | fromJustAt lbl = noteAt lbl ()
65 | fromJust : Has Fail fs => Maybe a -> Eff fs a
66 | fromJust = fromJustAt ()
72 | unExcept : ExceptL lbl err a -> err
73 | unExcept (Err e) = e
78 | -> {auto _ : Has (ExceptL lbl err) fs}
79 | -> (err -> Eff (fs - ExceptL lbl err) a)
81 | -> Eff (fs - ExceptL lbl err) a
82 | catchAt _ f = handleRelay pure $
\v,_ => f (unExcept v)
86 | {auto _ : Has (Except err) fs}
87 | -> (err -> Eff (fs - Except err) a)
89 | -> Eff (fs - Except err) a
95 | -> {auto _ : Has (ExceptL lbl err) fs}
97 | -> Eff (fs - ExceptL lbl err) (Either err a)
98 | runExceptAt _ = handleRelay (pure . Right) $
\v,_ => pure (Left $
unExcept v)
102 | {auto _ : Has (Except err) fs}
104 | -> Eff (fs - Except err) (Either err a)
105 | runExcept = runExceptAt ()
110 | -> {auto _ : Has (FailL lbl) fs}
112 | -> Eff (fs - FailL lbl) (Maybe a)
113 | runFailAt lbl = map (either (const Nothing) Just) . runExceptAt lbl
116 | runFail : Has Fail fs => Eff fs a -> Eff (fs - Fail) (Maybe a)
117 | runFail = runFailAt ()