forked from Andarist/XPromise
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathXPromise.js
More file actions
63 lines (63 loc) · 1.88 KB
/
Copy pathXPromise.js
File metadata and controls
63 lines (63 loc) · 1.88 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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
export default (({ U, tryCatch }) => U(XPromise => Object.assign(
(action, state = { resolvers: [], rejectors: [] }) => (
tryCatch(
() =>
action(
value =>
!state.left && !state.right &&
(
state.right = typeof state.then === 'function' ? state.then(value) : value,
state.resolvers.map(resolver => resolver(state.right)),
state.resolvers.splice(0)
),
value =>
!state.left && !state.right &&
(
typeof state.catch === 'function'
? state.right = state.catch(value)
: state.left = value,
state.rejectors.map(resolver => resolver(state.left)),
state.rejectors.splice(0)
),
),
(err) => (
delete state.right,
state.left = err,
state.rejectors.map(f => f(state.left))
)
),
{
then: (f, g) => (
XPromise(XPromise)(
(resolve, reject) => (
'left' in state ? reject(state.left) : state.rejectors.push(reject),
'right' in state ? resolve(state.right) : state.resolvers.push(resolve)
),
{ then: f, catch: g, resolvers: [], rejectors: [] },
)
),
catch: f => (
XPromise(XPromise)(
(resolve, reject) => (
'left' in state ? reject(state.left) : state.rejectors.push(reject),
'right' in state ? resolve(state.right) : state.resolvers.push(resolve)
),
{ catch: f, resolvers: [], rejectors: [] },
)
),
}
),
{
resolve: value => XPromise(XPromise)(resolve => resolve(value)),
reject: value => XPromise(XPromise)((_, reject) => reject(value)),
}
)))({
U: f => f(f),
tryCatch: (tryfunc, catchfunc) => {
try {
tryfunc()
} catch (err) {
catchfunc(err)
}
},
})