@typed/effects
Version:
Generator-powered Effect management
33 lines • 1.15 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.combine = void 0;
const disposable_1 = require("@typed/disposable");
const env_1 = require("@typed/env");
const run_1 = require("../run");
function* combine(...effects) {
if (effects.length === 0) {
return [];
}
return yield combineEnvs(effects.map(run_1.runEffect));
}
exports.combine = combine;
function combineEnvs(envs) {
return (c) => env_1.Resume.create((cb) => {
const hasValues = Array(envs.length).fill(false);
const values = Array(envs.length);
const disposable = disposable_1.Disposable.lazy();
function onValue(value, index) {
hasValues[index] = true;
values[index] = value;
if (hasValues.every(Boolean)) {
disposable.addDisposable(cb(values));
}
return disposable_1.Disposable.None;
}
for (let i = 0; i < envs.length; ++i) {
disposable.addDisposable(env_1.runEnv((value) => onValue(value, i), c, envs[i]));
}
return disposable;
});
}
//# sourceMappingURL=combine.js.map
;