@typed/effects
Version:
Generator-powered Effect management
26 lines • 1.03 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.runEffect = void 0;
const env_1 = require("@typed/env");
const Failure_1 = require("../failures/Failure");
exports.runEffect = (effect) => (c) => {
const generator = effect[Symbol.iterator]();
return runEffectGenerator(generator, generator.next(), c);
};
const nextResult = (value, generator) => {
if (value instanceof Failure_1.Failure) {
return value.unpack((e) => generator.throw(e), (a) => generator.return(a));
}
return generator.next(value);
};
const runEffectGenerator = (generator, result, capabilities) => {
while (!result.done) {
const resume = result.value(capabilities);
if (resume.type === 'lazy') {
return env_1.Resume.chain((value) => runEffectGenerator(generator, nextResult(value, generator), capabilities), resume);
}
result = nextResult(resume.value, generator);
}
return env_1.Resume.of(result.value);
};
//# sourceMappingURL=runEffect.js.map
;