@typed/effects
Version:
Generator-powered Effect management
31 lines • 1.22 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.join = exports.Join = void 0;
const disposable_1 = require("@typed/disposable");
const either_1 = require("@typed/either");
const env_1 = require("@typed/env");
const Effect_1 = require("../Effect");
const failures_1 = require("../failures");
const Fiber_1 = require("./Fiber");
exports.Join = {
join(fiber) {
const { info } = fiber;
if (info.state === 1 /* Returned */) {
return env_1.Resume.of(either_1.Either.of(info.value));
}
if (info.state === 2 /* Error */) {
return env_1.Resume.of(either_1.Left.of(info.error));
}
return env_1.Resume.create((cb) => {
const disposable = disposable_1.Disposable.lazy();
fiber.addDisposable(disposable);
info.promise.then((value) => disposable.addDisposable(cb(either_1.Right.of(value))), (error) => disposable.addDisposable(cb(either_1.Left.of(error))));
return disposable;
});
},
};
function* join(f) {
return yield* failures_1.orFail(Fiber_1.FiberFailure, Effect_1.Effect.fromEnv((c) => c.join(f)));
}
exports.join = join;
//# sourceMappingURL=join.js.map
;