fusion-cli/build/shared-state-containers.js (43 lines of code) (raw):
// @flow
/* eslint-env node */
class DeferredState /*::<T>*/ {
/*::
resolve: T => void;
reject: T => void;
result: Promise<T>;
*/
constructor() {
this.reset();
}
reset() {
this.result = new Promise((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
});
}
}
class SyncState /*::<T>*/ {
/*::
set: T => void;
value: T
*/
constructor(initialValue /*:T*/) {
this.value = initialValue;
}
set(value /*:T*/) {
this.value = value;
}
}
class MergedDeferredState /*::<T, U>*/ {
/*::
states: Array<{
deferred: DeferredState<T>,
enabled: SyncState<boolean>,
}>;
mergeResultsFn: Array<T> => U;
result: Promise<U>;
*/
constructor(states /*: any */, mergeResultsFn /*: Array<T> => U */) {
this.states = states;
this.mergeResultsFn = mergeResultsFn;
this.reset();
}
reset() {
this.result = Promise.all(
this.states
.filter(state => state.enabled.value)
.map(state => {
return state.deferred.result;
})
).then(resolved => {
const result = this.mergeResultsFn(resolved);
return result;
});
}
}
module.exports = {
DeferredState,
SyncState,
MergedDeferredState,
};