UNPKG

@effect-ts/system

Version:

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

257 lines (229 loc) 6.63 kB
// ets_tracing: off import * as Cause from "../../../Cause/core.mjs"; import * as E from "../../../Either/index.mjs"; import { identity } from "../../../Function/index.mjs"; import * as O from "../../../Option/index.mjs"; import * as L from "../List/core.mjs"; import * as Tp from "../Tuple/index.mjs"; import * as P from "./primitives.mjs"; /** * Returns the first event in this collection of events. If multiple events * occur in parallel and before any other events then any of these events * may be returned. */ export function first(self) { // eslint-disable-next-line no-constant-condition while (1) { switch (self._tag) { case "Single": { return O.some(self.a); } case "Empty": { return O.none; } case "Both": { self = self.left; break; } case "Then": { self = self.left; break; } } } throw new Error("Bug"); } function foldLoop(emptyCase, singleCase, thenCase, bothCase, inp, out) { // eslint-disable-next-line no-constant-condition while (1) { if (L.isEmpty(inp)) { return L.reduce_(out, L.empty(), (acc, val) => { if (val._tag === "Right") { return L.prepend_(acc, val.right); } else { if (val.left) { let parSeqs = acc; const left = L.unsafeFirst(parSeqs); parSeqs = L.tail(parSeqs); const right = L.unsafeFirst(parSeqs); parSeqs = L.tail(parSeqs); return L.prepend_(parSeqs, bothCase(left, right)); } else { let parSeqs = acc; const left = L.unsafeFirst(parSeqs); parSeqs = L.tail(parSeqs); const right = L.unsafeFirst(parSeqs); parSeqs = L.tail(parSeqs); return L.prepend_(parSeqs, thenCase(left, right)); } } }); } else { const head = L.unsafeFirst(inp); const parSeqs = L.tail(inp); switch (head._tag) { case "Empty": { inp = parSeqs; out = L.prepend_(out, E.right(emptyCase)); break; } case "Single": { inp = parSeqs; out = L.prepend_(out, E.right(singleCase(head.a))); break; } case "Then": { inp = L.prepend_(L.prepend_(parSeqs, head.right), head.left); out = L.prepend_(out, E.left(false)); break; } case "Both": { inp = L.prepend_(L.prepend_(parSeqs, head.right), head.left); out = L.prepend_(out, E.left(true)); break; } } } } throw new Error("Bug"); } /** * Folds over the events in this collection of events using the specified * functions. */ export function fold_(self, emptyCase, singleCase, thenCase, bothCase) { return L.unsafeFirst(foldLoop(emptyCase, singleCase, thenCase, bothCase, L.of(self), L.empty())); } /** * Folds over the events in this collection of events using the specified * functions. * * @ets_data_first fold_ */ export function fold(emptyCase, singleCase, thenCase, bothCase) { return self => fold_(self, emptyCase, singleCase, thenCase, bothCase); } /** * Constructs a new collection of events for each event in this collection of * events, collecting them back into a single collection of events. */ export function chain_(self, f) { return fold_(self, P.empty, f, P.combineSeq_, P.combinePar_); } /** * Constructs a new collection of events for each event in this collection of * events, collecting them back into a single collection of events. * * @ets_data_first chain_ */ export function chain(f) { return self => chain_(self, f); } /** * Flattens a collection of collections of events into a single collection * of events. */ export function flatten(self) { return chain_(self, identity); } /** * Converts a ParSeq to a Cause */ export function toCause(self) { return fold_(self, Cause.empty, Cause.fail, Cause.combineSeq, Cause.combinePar); } /** * Transforms the type of events in this collection of events with the * specified function. */ export function map_(self, f) { return chain_(self, a => P.single(f(a))); } /** * Transforms the type of events in this collection of events with the * specified function. * * @ets_data_first map_ */ export function map(f) { return self => map_(self, f); } /** * Combines this collection of events with that collection of events to * return the Cartesian product of events using the specified function. */ export function zipWith_(self, that, f) { return chain_(self, a => map_(that, b => f(a, b))); } /** * Combines this collection of events with that collection of events to * return the Cartesian product of events using the specified function. * * @ets_data_first zipWith_ */ export function zipWith(that, f) { return self => zipWith_(self, that, f); } /** * Combines this collection of events with that collection of events to * return the Cartesian product of events, combining the elements into a * tuple. */ export function zip_(self, that) { return zipWith_(self, that, Tp.tuple); } /** * Combines this collection of events with that collection of events to * return the Cartesian product of events, combining the elements into a * tuple. * * @ets_data_first zip_ */ export function zip(that) { return self => zip_(self, that); } /** * Combines this collection of events with that collection of events to * return the Cartesian product of events, keeping only the events from this * collection. */ export function zipLeft_(self, that) { return zipWith_(self, that, (a, _b) => a); } /** * Combines this collection of events with that collection of events to * return the Cartesian product of events, keeping only the events from this * collection. * * @ets_data_first zipLeft_ */ export function zipLeft(that) { return self => zipLeft_(self, that); } /** * Combines this collection of events with that collection of events to * return the Cartesian product of events, keeping only the events from that * collection. */ export function zipRight_(self, that) { return zipWith_(self, that, (_a, b) => b); } /** * Combines this collection of events with that collection of events to * return the Cartesian product of events, keeping only the events from that * collection. * * @ets_data_first zipRight_ */ export function zipRight(that) { return self => zipRight_(self, that); } //# sourceMappingURL=core.mjs.map