-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhyper-async.js
81 lines (79 loc) · 1.72 KB
/
hyper-async.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/**
* @callback Function
* @param {unknown} x
* @returns {unknown}
*
* @callback AsyncFunction
* @param {unknown} fn
* @returns {Async}
*
* @callback BiFunction
* @param {Function} x
* @param {Function} y
* @returns {Async}
*
* @callback Handler
* @param {unknown} fn
* @returns {unknown}
*
* @callback Fork
* @param {Handler} rejected
* @param {Handler} resolved
* @returns {unknown}
*
* @callback Map
* @param {Function} fn
* @returns {Async}
*
* @callback Chain
* @param {AsyncFunction} fn
* @returns {Async}
*
* @callback Async
* @param {Fork} fork
* @returns {{fork: Fork, toPromise: Promise<unknown>, map: Map, bimap: BiFunction, chain: Chain, bichain: BiChainFn, fold: Fold}}
*/
const Async = (fork) => ({
fork,
toPromise: () => new Promise((resolve, reject) => fork(reject, resolve)),
map: (fn) => Async((rej, res) => fork(rej, (x) => res(fn(x)))),
bimap: (f, g) =>
Async((rej, res) =>
fork(
(x) => rej(f(x)),
(x) => res(g(x))
)
),
chain: (fn) => Async((rej, res) => fork(rej, (x) => fn(x).fork(rej, res))),
bichain: (f, g) =>
Async((rej, res) =>
fork(
(x) => f(x).fork(rej, res),
(x) => g(x).fork(rej, res)
)
),
fold: (f, g) =>
Async((rej, res) =>
fork(
(x) => f(x).fork(rej, res),
(x) => g(x).fork(rej, res)
)
),
});
export const of = (x) => Async((rej, res) => res(x));
export const Resolved = (x) => Async((rej, res) => res(x));
export const Rejected = (x) => Async((rej, res) => rej(x));
export const fromPromise =
(f) =>
(...args) =>
Async((rej, res) =>
f(...args)
.then(res)
.catch(rej)
);
export default {
of,
fromPromise,
Resolved,
Rejected,
};