0 | module JS.Promise
 1 |
 2 | import JS.Marshall
 3 |
 4 | %default total
 5 |
 6 | export
 7 | data Promise : Type -> Type where [external]
 8 |
 9 | export
10 | ToFFI (Promise a) (Promise a) where toFFI = id
11 |
12 | export
13 | FromFFI (Promise a) (Promise a) where fromFFI = Just
14 |
15 | %foreign "javascript:lambda:(a,reg,w) => new Promise ((cb) => reg((x) => cb(x))(w))"
16 | prim__promise : ((a -> PrimIO ()) -> PrimIO ()) -> PrimIO (Promise a)
17 |
18 | %foreign "javascript:lambda:(a,b,p,succ,err,w) => p.then((x) => succ(x)(w),(x) => err(`${x}`)(w))"
19 | prim__then :
20 |      Promise a
21 |   -> (a -> PrimIO b)
22 |   -> (String -> PrimIO b)
23 |   -> PrimIO (Promise b)
24 |
25 | %foreign "javascript:lambda:(a,b,p,succ,err,w) => p.then((x) => succ(x)(w),(x) => err(`${x}`)(w))"
26 | prim__thenp :
27 |      Promise a
28 |   -> (a -> PrimIO (Promise b))
29 |   -> (String -> PrimIO (Promise b))
30 |   -> PrimIO (Promise b)
31 |
32 | export %inline
33 | toPromise : ((a -> IO ()) -> IO ()) -> IO (Promise a)
34 | toPromise reg = primIO $ prim__promise (\f => toPrim (reg $ \x => fromPrim $ f x))
35 |
36 | ||| Attaches two handlers to a promise.
37 | export %inline
38 | onPromise : Promise a -> (a -> IO b) -> (String -> IO b) -> IO (Promise b)
39 | onPromise p f g =
40 |   primIO $ prim__then p (\x => toPrim $ f x) (\x => toPrim $ g x)
41 |
42 | ||| Like `onPromise` but the handlers themselves can return promises.
43 | export %inline
44 | onPromiseP :
45 |      Promise a
46 |   -> (a -> IO (Promise b))
47 |   -> (String -> IO (Promise b))
48 |   -> IO (Promise b)
49 | onPromiseP p f g =
50 |   primIO $ prim__thenp p (\x => toPrim $ f x) (\x => toPrim $ g x)
51 |
52 |