@typed/effects
Version:
Generator-powered Effect management
27 lines • 866 B
JavaScript
import { Disposable } from '@typed/disposable';
import { provide, Resume, runPure } from '@typed/env';
import { runEffect } from '../run';
export function* race(...effects) {
const env = (c) => Resume.create((cb) => {
const disposable = Disposable.lazy();
const ifNotResolved = createIfNotResolved(cb, disposable);
for (const effect of effects) {
const pure = provide(runEffect(effect), c);
disposable.addDisposable(runPure(ifNotResolved, pure));
}
return disposable;
});
return yield env;
}
function createIfNotResolved(cb, disposable) {
let resolved = false;
return (value) => {
if (!resolved) {
resolved = true;
disposable.dispose();
return cb(value);
}
return Disposable.None;
};
}
//# sourceMappingURL=race.js.map