@typed/effects
Version:
Generator-powered Effect management
29 lines • 988 B
JavaScript
import { Disposable } from '@typed/disposable';
import { Resume, runEnv } from '@typed/env';
import { runEffect } from '../run';
export function* combine(...effects) {
if (effects.length === 0) {
return [];
}
return yield combineEnvs(effects.map(runEffect));
}
function combineEnvs(envs) {
return (c) => Resume.create((cb) => {
const hasValues = Array(envs.length).fill(false);
const values = Array(envs.length);
const disposable = Disposable.lazy();
function onValue(value, index) {
hasValues[index] = true;
values[index] = value;
if (hasValues.every(Boolean)) {
disposable.addDisposable(cb(values));
}
return Disposable.None;
}
for (let i = 0; i < envs.length; ++i) {
disposable.addDisposable(runEnv((value) => onValue(value, i), c, envs[i]));
}
return disposable;
});
}
//# sourceMappingURL=combine.js.map