UNPKG

@typed/effects

Version:

Generator-powered Effect management

29 lines 988 B
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