0 | module Control.Monad.MCancel
2 | import public Control.Monad.MErr
11 | data Outcome : List Type -> Type -> Type where
12 | Succeeded : (res : a) -> Outcome es a
13 | Error : (err : HSum es) -> Outcome es a
14 | Canceled : Outcome es a
17 | All Eq es => Eq a => Eq (Outcome es a) where
18 | Succeeded x == Succeeded y = x == y
19 | Error x == Error y = x == y
20 | Canceled == Canceled = True
24 | All Show es => Show a => Show (Outcome es a) where
25 | showPrec p (Succeeded x) = showCon p "Succeeded" (showArg x)
26 | showPrec p (Error x) = showCon p "Error" (showArg x)
27 | showPrec p Canceled = "Canceled"
30 | toOutcome : Result es a -> Outcome es a
31 | toOutcome (Right v) = Succeeded v
32 | toOutcome (Left errs) = Error errs
35 | fromOutcome : Outcome es a -> Result es (Maybe a)
36 | fromOutcome (Succeeded v) = Right (Just v)
37 | fromOutcome Canceled = Right Nothing
38 | fromOutcome (Error es) = Left es
41 | Functor (Outcome es) where
42 | map f (Succeeded v) = Succeeded (f v)
43 | map _ (Error v) = Error v
44 | map _ Canceled = Canceled
47 | Foldable (Outcome es) where
48 | foldr f x (Succeeded v) = f v x
51 | foldl f x (Succeeded v) = f x v
54 | foldMap f (Succeeded v) = f v
55 | foldMap f _ = neutral
57 | toList (Succeeded v) = [v]
60 | null (Succeeded v) = False
64 | Traversable (Outcome es) where
65 | traverse f (Succeeded v) = Succeeded <$> f v
66 | traverse _ (Error v) = pure $
Error v
67 | traverse _ Canceled = pure Canceled
70 | Applicative (Outcome es) where
72 | Succeeded f <*> Succeeded v = Succeeded (f v)
73 | Error err <*> _ = Error err
74 | Canceled <*> _ = Canceled
75 | _ <*> Error err = Error err
76 | _ <*> Canceled = Canceled
79 | Monad (Outcome es) where
80 | Succeeded v >>= f = f v
81 | Error x >>= _ = Error x
82 | Canceled >>= _ = Canceled
89 | 0 Poll : (f : List Type -> Type -> Type) -> Type
90 | Poll f = forall es,a . f es a -> f es a
93 | interface MErr f => MCancel f where
128 | uncancelable : (body: Poll f -> f es a) -> f es a
152 | onCancel : f es a -> f [] () -> f es a
154 | parameters {0 f : List Type -> Type -> Type}
155 | {auto mc : MCancel f}
162 | guaranteeCase : f es a -> (Outcome es a -> f [] ()) -> f es a
163 | guaranteeCase act fin =
164 | uncancelable $
\poll => do
165 | v <- onError (onCancel (poll act) (fin Canceled)) (fin . Error)
166 | weakenErrors (fin $
Succeeded v)
174 | guarantee : f es a -> f [] () -> f es a
175 | guarantee act = guaranteeCase act . const
182 | onAbort : f es a -> (cleanup : f [] ()) -> f es a
184 | guaranteeCase as $
\case
201 | (acquire : Poll f -> f es a)
202 | -> (use : a -> f es b)
203 | -> (release : a -> Outcome es b -> f [] ())
205 | bracketFull acquire use release =
206 | uncancelable $
\poll => do
208 | guaranteeCase (poll $
use v) (release v)
220 | -> (use : a -> f es b)
221 | -> (release : a -> Outcome es b -> f [] ())
223 | bracketCase = bracketFull . const
235 | -> (use : a -> f es b)
236 | -> (release : a -> f [] ())
238 | bracket acquire use release = bracketCase acquire use (const . release)