-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathEitherAsync.js
More file actions
39 lines (24 loc) · 1.27 KB
/
EitherAsync.js
File metadata and controls
39 lines (24 loc) · 1.27 KB
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
(function () {
const compose = (...fns) => x => fns.reduceRight((y, f) => f(y), x);
const id = x => x;
const EitherAsync = (actions, resolveMappings, rejectMappings) => ({
map: (f) => EitherAsync(actions, compose(f, resolveMappings), rejectMappings),
mapError: f => EitherAsync(actions, resolveMappings, compose(f, rejectMappings)),
bimap: (f, g) => EitherAsync(actions, compose(f, resolveMappings), compose(g, rejectMappings)),
ap: fv => EitherAsync((resolve, reject) => actions(f => fv.map(compose(f, resolveMappings)).cata({
ok: resolve,
error: reject
}), reject), resolveMappings, rejectMappings),
bind: f => EitherAsync((resolve, reject) => actions(x => f(resolveMappings(x)).cata({
ok: resolve,
error: reject
}), reject), id, id),
cata: alg => actions(compose(alg.ok, resolveMappings), compose(alg.error, rejectMappings)),
toPromise: () => new Promise((resolve, reject) => actions(compose(resolve, resolveMappings), compose(reject, rejectMappings))),
toEither: () => EitherAsync(actions, resolveMappings, rejectMappings),
});
Promise.prototype.toEither = function () {
return EitherAsync((resolve, reject) => this.then(resolve).catch(reject), id, id);
}
}())
module.exports = Promise