UNPKG

1.24 kBJavaScriptView Raw
1// @flow
2/* eslint-env node */
3
4class DeferredState /*::<T>*/ {
5 /*::
6 resolve: T => void;
7 reject: T => void;
8 result: Promise<T>;
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
21class SyncState /*::<T>*/ {
22 /*::
23 set: T => void;
24 value: T
25 */
26 constructor(initialValue /*:T*/) {
27 this.value = initialValue;
28 }
29 set(value /*:T*/) {
30 this.value = value;
31 }
32}
33
34class MergedDeferredState /*::<T, U>*/ {
35 /*::
36 states: Array<{
37 deferred: DeferredState<T>,
38 enabled: SyncState<boolean>,
39 }>;
40 mergeResultsFn: Array<T> => U;
41 result: Promise<U>;
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
62module.exports = {
63 DeferredState,
64 SyncState,
65 MergedDeferredState,
66};