UNPKG

@effect-ts/system

Version:

Effect-TS is a zero dependency set of libraries to write highly productive, purely functional TypeScript at scale.

1,184 lines (971 loc) 29.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ap = ap; exports.as = as; exports.chain = chain; exports.chainSafe_ = chainSafe_; exports.chain_ = chain_; Object.defineProperty(exports, "combinePar", { enumerable: true, get: function () { return _cause.combinePar; } }); Object.defineProperty(exports, "combineSeq", { enumerable: true, get: function () { return _cause.combineSeq; } }); exports.contains = contains; exports.containsSafe = containsSafe; exports.defects = defects; Object.defineProperty(exports, "die", { enumerable: true, get: function () { return _cause.die; } }); exports.dieOption = dieOption; exports.died = died; Object.defineProperty(exports, "empty", { enumerable: true, get: function () { return _cause.empty; } }); Object.defineProperty(exports, "fail", { enumerable: true, get: function () { return _cause.fail; } }); exports.failed = failed; exports.failureOption = failureOption; exports.failureOrCause = failureOrCause; exports.failures = failures; exports.find = find; exports.findSafe = findSafe; exports.flatten = void 0; exports.flipCauseOption = flipCauseOption; exports.fold = fold; exports.foldSafe = foldSafe; Object.defineProperty(exports, "interrupt", { enumerable: true, get: function () { return _cause.interrupt; } }); exports.interruptOption = interruptOption; exports.interrupted = interrupted; exports.interruptedOnly = interruptedOnly; exports.interruptors = interruptors; Object.defineProperty(exports, "isEmpty", { enumerable: true, get: function () { return _cause.isEmpty; } }); exports.keepDefects = keepDefects; exports.keepDefectsSafe = keepDefectsSafe; exports.map = map; exports.map_ = map_; exports.reduceLeft = reduceLeft; exports.sequenceCauseEither = sequenceCauseEither; exports.sequenceCauseEitherSafe = sequenceCauseEitherSafe; exports.sequenceCauseOption = sequenceCauseOption; exports.sequenceCauseOptionSafe = sequenceCauseOptionSafe; exports.squash = squash; exports.stripFailures = stripFailures; exports.stripFailuresSafe = stripFailuresSafe; exports.stripInterrupts = stripInterrupts; exports.stripInterruptsSafe = stripInterruptsSafe; exports.stripSomeDefects = stripSomeDefects; exports.stripSomeDefectsSafe = stripSomeDefectsSafe; exports.stripSomeDefects_ = stripSomeDefects_; Object.defineProperty(exports, "traced", { enumerable: true, get: function () { return _cause.traced; } }); exports.untraced = untraced; exports.untracedSafe = untracedSafe; var A = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../Collections/Immutable/Array/index.js")); var E = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../Either/index.js")); var _index3 = /*#__PURE__*/require("../Function/index.js"); var S = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../IO/index.js")); var O = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../Option/index.js")); var _index6 = /*#__PURE__*/require("../Stack/index.js"); var _cause = /*#__PURE__*/require("./cause.js"); var _errors = /*#__PURE__*/require("./errors.js"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } // ets_tracing: off /* eslint-disable prefer-const */ /** * Applicative's ap */ function ap(fa) { return chain(f => map(f)(fa)); } /** * Substitute the E in the cause */ function as(e) { return map(() => e); } /** * Builds a Cause depending on the result of another */ function chain_(cause, f) { return S.run(chainSafe_(cause, f)); } /** * Builds a Cause depending on the result of another */ function chain(f) { return cause => chain_(cause, f); } /** * Builds a Cause depending on the result of another */ function chainSafe_(cause, f) { switch (cause._tag) { case "Empty": { return S.succeed(_cause.empty); } case "Fail": { return S.succeed(f(cause.value)); } case "Die": { return S.succeed(cause); } case "Interrupt": { return S.succeed(cause); } case "Then": { return S.zipWith_(S.suspend(() => chainSafe_(cause.left, f)), S.suspend(() => chainSafe_(cause.right, f)), (l, r) => (0, _cause.combineSeq)(l, r)); } case "Both": { return S.zipWith_(S.suspend(() => chainSafe_(cause.left, f)), S.suspend(() => chainSafe_(cause.right, f)), (l, r) => (0, _cause.combinePar)(l, r)); } case "Traced": { return S.map_(chainSafe_(cause.cause, f), x => (0, _cause.traced)(x, cause.trace)); } } } /** * Equivalent to chain((a) => Fail(f(a))) */ function map_(cause, f) { return chain_(cause, e => (0, _cause.fail)(f(e))); } /** * Equivalent to chain((a) => Fail(f(a))) */ function map(f) { return cause => map_(cause, f); } /** * Determines if this cause contains or is equal to the specified cause. */ function contains(that) { return cause => S.run(containsSafe(that)(cause)); } /** * Determines if this cause contains or is equal to the specified cause. */ function containsSafe(that) { return cause => S.gen(function* (_) { if (yield* _(cause.equalsSafe(that))) { return true; } return yield* _(reduceLeft(S.succeed(false))((_, c) => O.some(S.chain_(_, b => b ? S.succeed(b) : c.equalsSafe(that))))(cause)); }); } /** * Extracts a list of non-recoverable errors from the `Cause`. */ function defects(cause) { return reduceLeft([])((a, c) => c._tag === "Die" ? O.some([...a, c.value]) : O.none)(cause); } /** * Returns the `Error` associated with the first `Die` in this `Cause` if * one exists. */ function dieOption(cause) { return find(c => c._tag === "Die" ? O.some(c.value) : O.none)(cause); } /** * Returns if a cause contains a defect */ function died(cause) { return O.getOrElse_(O.map_(dieOption(cause), () => true), () => false); } /** * Returns the `E` associated with the first `Fail` in this `Cause` if one * exists. */ function failureOption(cause) { return find(c => c._tag === "Fail" ? O.some(c.value) : O.none)(cause); } /** * Returns if the cause has a failure in it */ function failed(cause) { return O.getOrElse_(O.map_(failureOption(cause), () => true), () => false); } /** * Retrieve the first checked error on the `Left` if available, * if there are no checked errors return the rest of the `Cause` * that is known to contain only `Die` or `Interrupt` causes. * */ function failureOrCause(cause) { return O.getOrElse_(O.map_(failureOption(cause), E.left), () => E.right(cause)); } /** * Produces a list of all recoverable errors `E` in the `Cause`. */ function failures(cause) { return reduceLeft([])((a, c) => c._tag === "Fail" ? O.some([...a, c.value]) : O.none)(cause); } /** * Remove all `Die` causes that the specified partial function is defined at, * returning `Some` with the remaining causes or `None` if there are no * remaining causes. */ function stripSomeDefects(f) { return cause => { return S.run(stripSomeDefectsSafe(cause, f)); }; } /** * Remove all `Die` causes that the specified partial function is defined at, * returning `Some` with the remaining causes or `None` if there are no * remaining causes. */ function stripSomeDefects_(cause, f) { return S.run(stripSomeDefectsSafe(cause, f)); } /** * Filter out all `Die` causes according to the specified function, * returning `Some` with the remaining causes or `None` if there are no * remaining causes. */ function stripSomeDefectsSafe(cause, f) { switch (cause._tag) { case "Empty": { return S.succeed(O.none); } case "Interrupt": { return S.succeed(O.some(cause)); } case "Fail": { return S.succeed(O.some(cause)); } case "Die": { return S.succeed(O.map_(f(cause.value), _cause.die)); } case "Both": { return S.zipWith_(S.suspend(() => stripSomeDefectsSafe(cause.left, f)), S.suspend(() => stripSomeDefectsSafe(cause.right, f)), (l, r) => { if (l._tag === "Some" && r._tag === "Some") { return O.some((0, _cause.combinePar)(l.value, r.value)); } else if (l._tag === "Some") { return l; } else if (r._tag === "Some") { return r; } else { return O.none; } }); } case "Then": { return S.zipWith_(S.suspend(() => stripSomeDefectsSafe(cause.left, f)), S.suspend(() => stripSomeDefectsSafe(cause.right, f)), (l, r) => { if (l._tag === "Some" && r._tag === "Some") { return O.some((0, _cause.combineSeq)(l.value, r.value)); } else if (l._tag === "Some") { return l; } else if (r._tag === "Some") { return r; } else { return O.none; } }); } case "Traced": { return S.suspend(() => stripSomeDefectsSafe(cause.cause, f)); } } } /** * Finds the first result matching f */ function find(f) { return cause => S.run(findSafe(f)(cause)); } /** * Finds the first result matching f */ function findSafe(f) { return cause => { const apply = f(cause); if (apply._tag === "Some") { return S.succeed(apply); } switch (cause._tag) { case "Then": { return S.chain_(S.suspend(() => findSafe(f)(cause.left)), isLeft => { if (isLeft._tag === "Some") { return S.succeed(isLeft); } else { return findSafe(f)(cause.right); } }); } case "Traced": { return S.suspend(() => findSafe(f)(cause.cause)); } case "Both": { return S.chain_(S.suspend(() => findSafe(f)(cause.left)), isLeft => { if (isLeft._tag === "Some") { return S.succeed(isLeft); } else { return findSafe(f)(cause.right); } }); } default: { return S.succeed(apply); } } }; } /** * Equivalent to chain(identity) */ const flatten = /*#__PURE__*/chain(_index3.identity); /** * Folds over a cause */ exports.flatten = flatten; function fold(empty, failCase, dieCase, interruptCase, thenCase, bothCase, tracedCase) { return cause => S.run(foldSafe(empty, failCase, dieCase, interruptCase, thenCase, bothCase, tracedCase)(cause)); } /** * Folds over a cause */ function foldSafe(empty, failCase, dieCase, interruptCase, thenCase, bothCase, tracedCase) { return cause => { switch (cause._tag) { case "Empty": { return S.succeedWith(empty); } case "Fail": { return S.succeed(failCase(cause.value)); } case "Die": { return S.succeed(dieCase(cause.value)); } case "Interrupt": { return S.succeed(interruptCase(cause.fiberId)); } case "Traced": { return S.map_(S.suspend(() => foldSafe(empty, failCase, dieCase, interruptCase, thenCase, bothCase, tracedCase)(cause.cause)), x => tracedCase(x, cause.trace)); } case "Both": { return S.zipWith_(S.suspend(() => foldSafe(empty, failCase, dieCase, interruptCase, thenCase, bothCase, tracedCase)(cause.left)), S.suspend(() => foldSafe(empty, failCase, dieCase, interruptCase, thenCase, bothCase, tracedCase)(cause.right)), (l, r) => bothCase(l, r)); } case "Then": { return S.zipWith_(S.suspend(() => foldSafe(empty, failCase, dieCase, interruptCase, thenCase, bothCase, tracedCase)(cause.left)), S.suspend(() => foldSafe(empty, failCase, dieCase, interruptCase, thenCase, bothCase, tracedCase)(cause.right)), (l, r) => thenCase(l, r)); } } }; } /** * Accumulates a state over a Cause */ function reduceLeft(z) { return f => { return cause => { let causes = undefined; let current = cause; let acc = z; while (current) { const x = f(acc, current); acc = x._tag === "Some" ? x.value : acc; switch (current._tag) { case "Then": { causes = new _index6.Stack(current.right, causes); current = current.left; break; } case "Both": { causes = new _index6.Stack(current.right, causes); current = current.left; break; } case "Traced": { current = current.cause; break; } default: { current = undefined; break; } } if (!current && causes) { current = causes.value; causes = causes.previous; } } return acc; }; }; } /** * Returns if the cause contains an interruption in it */ function interrupted(cause) { return O.getOrElse_(O.map_(interruptOption(cause), () => true), () => false); } /** * Returns the `FiberID` associated with the first `Interrupt` in this `Cause` if one * exists. */ function interruptOption(cause) { return find(c => c._tag === "Interrupt" ? O.some(c.fiberId) : O.none)(cause); } /** * Determines if the `Cause` contains only interruptions and not any `Die` or * `Fail` causes. */ function interruptedOnly(cause) { return O.getOrElse_(find(c => c._tag === "Die" || c._tag === "Fail" ? O.some(false) : O.none)(cause), () => true); } /** * Returns a set of interruptors, fibers that interrupted the fiber described * by this `Cause`. */ function interruptors(cause) { return Array.from(reduceLeft(new Set())((s, c) => c._tag === "Interrupt" ? O.some(s.add(c.fiberId)) : O.none)(cause)); } /** * Remove all `Fail` and `Interrupt` nodes from this `Cause`, * return only `Die` cause/finalizer defects. */ function keepDefectsSafe(cause) { switch (cause._tag) { case "Empty": { return S.succeed(O.none); } case "Fail": { return S.succeed(O.none); } case "Interrupt": { return S.succeed(O.none); } case "Die": { return S.succeed(O.some(cause)); } case "Traced": { return S.map_(S.suspend(() => keepDefectsSafe(cause.cause)), x => O.map_(x, _ => (0, _cause.traced)(_, cause.trace))); } case "Then": { return S.zipWith_(S.suspend(() => keepDefectsSafe(cause.left)), S.suspend(() => keepDefectsSafe(cause.right)), (l, r) => { if (l._tag === "Some" && r._tag === "Some") { return O.some((0, _cause.combineSeq)(l.value, r.value)); } else if (l._tag === "Some") { return l; } else if (r._tag === "Some") { return r; } else { return O.none; } }); } case "Both": { return S.zipWith_(S.suspend(() => keepDefectsSafe(cause.left)), S.suspend(() => keepDefectsSafe(cause.right)), (l, r) => { if (l._tag === "Some" && r._tag === "Some") { return O.some((0, _cause.combinePar)(l.value, r.value)); } else if (l._tag === "Some") { return l; } else if (r._tag === "Some") { return r; } else { return O.none; } }); } } } /** * Remove all `Fail` and `Interrupt` nodes from this `Cause`, * return only `Die` cause/finalizer defects. */ function keepDefects(cause) { return S.run(keepDefectsSafe(cause)); } /** * Converts the specified `Cause<Either<E, A>>` to an `Either<Cause<E>, A>`. */ function sequenceCauseEither(c) { return S.run(sequenceCauseEitherSafe(c)); } /** * Converts the specified `Cause<Either<E, A>>` to an `Either<Cause<E>, A>`. */ function sequenceCauseEitherSafe(c) { switch (c._tag) { case "Empty": { return S.succeed(E.left(_cause.empty)); } case "Interrupt": { return S.succeed(E.left(c)); } case "Fail": { return S.succeed(c.value._tag === "Left" ? E.left((0, _cause.fail)(c.value.left)) : E.right(c.value.right)); } case "Traced": { return S.map_(S.suspend(() => sequenceCauseEitherSafe(c.cause)), x => E.mapLeft_(x, _ => (0, _cause.traced)(_, c.trace))); } case "Die": { return S.succeed(E.left(c)); } case "Then": { return S.zipWith_(S.suspend(() => sequenceCauseEitherSafe(c.left)), S.suspend(() => sequenceCauseEitherSafe(c.right)), (l, r) => { if (l._tag === "Left") { if (r._tag === "Right") { return E.right(r.right); } else { return E.left((0, _cause.combineSeq)(l.left, r.left)); } } else { return E.right(l.right); } }); } case "Both": { return S.zipWith_(S.suspend(() => sequenceCauseEitherSafe(c.left)), S.suspend(() => sequenceCauseEitherSafe(c.right)), (l, r) => { if (l._tag === "Left") { if (r._tag === "Right") { return E.right(r.right); } else { return E.left((0, _cause.combinePar)(l.left, r.left)); } } else { return E.right(l.right); } }); } } } /** * Converts the specified `Cause<Option<E>>` to an `Option<Cause<E>>` by * recursively stripping out any failures with the error `None`. */ function sequenceCauseOptionSafe(c) { switch (c._tag) { case "Empty": { return S.succeed(O.some(_cause.empty)); } case "Interrupt": { return S.succeed(O.some(c)); } case "Traced": { return S.map_(S.suspend(() => sequenceCauseOptionSafe(c.cause)), x => O.map_(x, _ => (0, _cause.traced)(_, c.trace))); } case "Fail": { return S.succeed(O.map_(c.value, _cause.fail)); } case "Die": { return S.succeed(O.some(c)); } case "Then": { return S.zipWith_(S.suspend(() => sequenceCauseOptionSafe(c.left)), S.suspend(() => sequenceCauseOptionSafe(c.right)), (l, r) => { if (l._tag === "Some" && r._tag === "Some") { return O.some((0, _cause.combineSeq)(l.value, r.value)); } else if (l._tag === "Some") { return O.some(l.value); } else if (r._tag === "Some") { return O.some(r.value); } else { return O.none; } }); } case "Both": { return S.zipWith_(S.suspend(() => sequenceCauseOptionSafe(c.left)), S.suspend(() => sequenceCauseOptionSafe(c.right)), (l, r) => { if (l._tag === "Some" && r._tag === "Some") { return O.some((0, _cause.combinePar)(l.value, r.value)); } else if (l._tag === "Some") { return O.some(l.value); } else if (r._tag === "Some") { return O.some(r.value); } else { return O.none; } }); } } } /** * Converts the specified `Cause<Option<E>>` to an `Option<Cause<E>>` by * recursively stripping out any failures with the error `None`. */ function sequenceCauseOption(c) { return S.run(sequenceCauseOptionSafe(c)); } /** * Squashes a `Cause` down to a single `Throwable`, chosen to be the * "most important" `Throwable`. */ function squash(f) { return cause => O.getOrElse_((o => o._tag === "Some" ? o : A.head(defects(cause)))((o => o._tag === "Some" ? o : interrupted(cause) ? O.some(new _errors.InterruptedException("Interrupted by fibers: " + Array.from(interruptors(cause)).map(_ => _.seqNumber.toString()).map(_ => "#" + _).join(", "))) : O.none)(O.map_(failureOption(cause), f))), () => new _errors.InterruptedException()); } /** * Discards all typed failures kept on this `Cause`. */ function stripFailures(cause) { switch (cause._tag) { case "Empty": { return _cause.empty; } case "Fail": { return _cause.empty; } case "Interrupt": { return cause; } case "Die": { return cause; } default: { return S.run(stripFailuresSafe(cause)); } } } /** * Discards all typed failures kept on this `Cause`. */ function stripFailuresSafe(cause) { switch (cause._tag) { case "Empty": { return S.succeed(_cause.empty); } case "Fail": { return S.succeed(_cause.empty); } case "Interrupt": { return S.succeed(cause); } case "Die": { return S.succeed(cause); } case "Traced": { return S.map_(S.suspend(() => stripFailuresSafe(cause.cause)), x => (0, _cause.traced)(x, cause.trace)); } case "Both": { return S.zipWith_(S.suspend(() => stripFailuresSafe(cause.left)), S.suspend(() => stripFailuresSafe(cause.right)), (l, r) => (0, _cause.combinePar)(l, r)); } case "Then": { return S.zipWith_(S.suspend(() => stripFailuresSafe(cause.left)), S.suspend(() => stripFailuresSafe(cause.right)), (l, r) => (0, _cause.combineSeq)(l, r)); } } } /** * Discards all typed failures kept on this `Cause`. */ function stripInterrupts(cause) { switch (cause._tag) { case "Empty": { return _cause.empty; } case "Fail": { return cause; } case "Interrupt": { return _cause.empty; } case "Die": { return cause; } default: { return S.run(stripInterruptsSafe(cause)); } } } /** * Discards all typed failures kept on this `Cause`. */ function stripInterruptsSafe(cause) { switch (cause._tag) { case "Empty": { return S.succeed(_cause.empty); } case "Fail": { return S.succeed(cause); } case "Interrupt": { return S.succeed(_cause.empty); } case "Die": { return S.succeed(cause); } case "Traced": { return S.map_(S.suspend(() => stripInterruptsSafe(cause.cause)), x => (0, _cause.traced)(x, cause.trace)); } case "Both": { return S.zipWith_(S.suspend(() => stripInterruptsSafe(cause.left)), S.suspend(() => stripInterruptsSafe(cause.right)), (l, r) => (0, _cause.combinePar)(l, r)); } case "Then": { return S.zipWith_(S.suspend(() => stripInterruptsSafe(cause.left)), S.suspend(() => stripInterruptsSafe(cause.right)), (l, r) => (0, _cause.combineSeq)(l, r)); } } } /** * Returns a `Cause` that has been stripped of all tracing information. */ function untraced(cause) { switch (cause._tag) { case "Die": case "Empty": case "Fail": case "Interrupt": return cause; default: return S.run(untracedSafe(cause)); } } /** * Returns a `Cause` that has been stripped of all tracing information. */ function untracedSafe(cause) { switch (cause._tag) { case "Traced": { return S.suspend(() => untracedSafe(cause.cause)); } case "Both": { return S.zipWith_(S.suspend(() => untracedSafe(cause.left)), S.suspend(() => untracedSafe(cause.right)), (l, r) => (0, _cause.combinePar)(l, r)); } case "Then": { return S.zipWith_(S.suspend(() => untracedSafe(cause.left)), S.suspend(() => untracedSafe(cause.right)), (l, r) => (0, _cause.combineSeq)(l, r)); } default: { return S.succeed(cause); } } } const FCOStackFrameDoneTypeId = /*#__PURE__*/Symbol(); class FCOStackFrameDone { constructor() { this._typeId = FCOStackFrameDoneTypeId; } } const FCOStackFrameTracedTypeId = /*#__PURE__*/Symbol(); class FCOStackFrameTraced { constructor(cause) { this.cause = cause; this._typeId = FCOStackFrameTracedTypeId; } } const FCOStackFrameThenLeftTypeId = /*#__PURE__*/Symbol(); class FCOStackFrameThenLeft { constructor(cause) { this.cause = cause; this._typeId = FCOStackFrameThenLeftTypeId; } } const FCOStackFrameThenRightTypeId = /*#__PURE__*/Symbol(); class FCOStackFrameThenRight { constructor(cause, leftResult) { this.cause = cause; this.leftResult = leftResult; this._typeId = FCOStackFrameThenRightTypeId; } } const FCOStackFrameBothLeftTypeId = /*#__PURE__*/Symbol(); class FCOStackFrameBothLeft { constructor(cause) { this.cause = cause; this._typeId = FCOStackFrameBothLeftTypeId; } } const FCOStackFrameBothRightTypeId = /*#__PURE__*/Symbol(); class FCOStackFrameBothRight { constructor(cause, leftResult) { this.cause = cause; this.leftResult = leftResult; this._typeId = FCOStackFrameBothRightTypeId; } } /** * Converts the specified `Cause<Either<E, A>>` to an `Either<Cause<E>, A>` by * recursively stripping out any failures with the error `None`. */ function flipCauseOption(c) { let stack = new _index6.Stack(new FCOStackFrameDone()); let result; recursion: while (stack) { // eslint-disable-next-line no-constant-condition pushing: while (true) { switch (c._tag) { case "Empty": result = O.some(_cause.empty); break pushing; case "Traced": stack = new _index6.Stack(new FCOStackFrameTraced(c), stack); c = c.cause; continue pushing; case "Interrupt": result = O.some((0, _cause.interrupt)(c.fiberId)); break pushing; case "Die": result = O.some(c); break pushing; case "Fail": result = O.fold_(c.value, () => O.none, r => O.some((0, _cause.fail)(r))); break pushing; case "Then": stack = new _index6.Stack(new FCOStackFrameThenLeft(c), stack); c = c.left; continue pushing; case "Both": stack = new _index6.Stack(new FCOStackFrameBothLeft(c), stack); c = c.left; continue pushing; } } // eslint-disable-next-line no-constant-condition popping: while (true) { const top = stack.value; stack = stack.previous; switch (top._typeId) { case FCOStackFrameDoneTypeId: return result; case FCOStackFrameTracedTypeId: result = O.map_(result, _ => (0, _cause.traced)(_, top.cause.trace)); continue popping; case FCOStackFrameThenLeftTypeId: c = top.cause.right; stack = new _index6.Stack(new FCOStackFrameThenRight(top.cause, result), stack); continue recursion; case FCOStackFrameThenRightTypeId: { const l = top.leftResult; if (O.isSome(l) && O.isSome(result)) { result = O.some((0, _cause.combineSeq)(l.value, result.value)); } if (O.isNone(l) && O.isSome(result)) { result = O.some(result.value); } if (O.isSome(l) && O.isNone(result)) { result = O.some(l.value); } result = O.none; continue popping; } case FCOStackFrameBothLeftTypeId: c = top.cause.right; stack = new _index6.Stack(new FCOStackFrameBothRight(top.cause, result), stack); continue recursion; case FCOStackFrameBothRightTypeId: { const l = top.leftResult; if (O.isSome(l) && O.isSome(result)) { result = O.some((0, _cause.combinePar)(l.value, result.value)); } if (O.isNone(l) && O.isSome(result)) { result = O.some(result.value); } if (O.isSome(l) && O.isNone(result)) { result = O.some(l.value); } result = O.none; continue popping; } } } } throw new Error("Bug"); } //# sourceMappingURL=core.js.map