@typed/effects
Version:
Generator-powered Effect management
27 lines • 1.01 kB
JavaScript
import { Disposable } from '@typed/disposable';
import { Either, Left, Right } from '@typed/either';
import { Resume } from '@typed/env';
import { Effect } from '../Effect';
import { orFail } from '../failures';
import { FiberFailure } from './Fiber';
export const Join = {
join(fiber) {
const { info } = fiber;
if (info.state === 1 /* Returned */) {
return Resume.of(Either.of(info.value));
}
if (info.state === 2 /* Error */) {
return Resume.of(Left.of(info.error));
}
return Resume.create((cb) => {
const disposable = Disposable.lazy();
fiber.addDisposable(disposable);
info.promise.then((value) => disposable.addDisposable(cb(Right.of(value))), (error) => disposable.addDisposable(cb(Left.of(error))));
return disposable;
});
},
};
export function* join(f) {
return yield* orFail(FiberFailure, Effect.fromEnv((c) => c.join(f)));
}
//# sourceMappingURL=join.js.map