0 | module FS.Concurrent.Util
2 | import Data.Linear.Deferred
11 | awaitRes : Deferred World (Result es a) -> Async e es a
12 | awaitRes def = await def >>= fromResult
16 | putErr : Deferred World (Result es ()) -> Outcome es () -> Async e [] ()
17 | putErr def (Error x) = putDeferred def (Left x)
18 | putErr def _ = pure ()
28 | (check : Deferred World a)
29 | -> (finally : Outcome fs () -> Async e [] ())
30 | -> EmptyStream (Async e) fs
31 | -> Async e es (Fiber [] ())
32 | parrunCase check finally p =
33 | assert_total $
start $
ignore $
34 | guaranteeCase (raceOutcome {es = []} (await check) (pull p)) $
\case
38 | Succeeded (Left _) => finally Canceled
39 | Succeeded (Right $
Succeeded o) => finally o
40 | Succeeded (Right x) => finally Canceled
41 | Canceled => finally Canceled
52 | (check : Deferred World a)
53 | -> (finally : Async e [] ())
54 | -> EmptyStream (Async e) fs
55 | -> Async e es (Fiber [] ())
56 | parrun check = parrunCase check . const