1 |
|
2 |
|
3 |
|
4 | class DeferredState /*::<T>*/ {
|
5 | |
6 |
|
7 |
|
8 |
|
9 |
|
10 | constructor() {
|
11 | this.reset();
|
12 | }
|
13 | reset() {
|
14 | this.result = new Promise((resolve, reject) => {
|
15 | this.resolve = resolve;
|
16 | this.reject = reject;
|
17 | });
|
18 | }
|
19 | }
|
20 |
|
21 | class SyncState /*::<T>*/ {
|
22 | |
23 |
|
24 |
|
25 |
|
26 | constructor(initialValue /*:T*/) {
|
27 | this.value = initialValue;
|
28 | }
|
29 | set(value /*:T*/) {
|
30 | this.value = value;
|
31 | }
|
32 | }
|
33 |
|
34 | class MergedDeferredState /*::<T, U>*/ {
|
35 | |
36 |
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 |
|
43 | constructor(states /*: any */, mergeResultsFn /*: Array<T> => U */) {
|
44 | this.states = states;
|
45 | this.mergeResultsFn = mergeResultsFn;
|
46 | this.reset();
|
47 | }
|
48 | reset() {
|
49 | this.result = Promise.all(
|
50 | this.states
|
51 | .filter(state => state.enabled.value)
|
52 | .map(state => {
|
53 | return state.deferred.result;
|
54 | })
|
55 | ).then(resolved => {
|
56 | const result = this.mergeResultsFn(resolved);
|
57 | return result;
|
58 | });
|
59 | }
|
60 | }
|
61 |
|
62 | module.exports = {
|
63 | DeferredState,
|
64 | SyncState,
|
65 | MergedDeferredState,
|
66 | };
|