UNPKG

@effect-ts/system

Version:

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

650 lines (519 loc) 18.3 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.collect = collect; exports.collectM = collectM; exports.collectM_ = collectM_; exports.collect_ = collect_; exports.contramap = contramap; exports.contramapM = contramapM; exports.contramapM_ = contramapM_; exports.contramap_ = contramap_; exports.dequeueRef = dequeueRef; exports.dimapError = dimapError; exports.dimapError_ = dimapError_; exports.dimapM = dimapM; exports.dimapM_ = dimapM_; exports.filterInput = filterInput; exports.filterInputM = filterInputM; exports.filterInputM_ = filterInputM_; exports.filterInput_ = filterInput_; exports.filterOutput = filterOutput; exports.filterOutputM = filterOutputM; exports.filterOutputM_ = filterOutputM_; exports.filterOutput_ = filterOutput_; exports.fold = fold; exports.foldAllM = foldAllM; exports.foldAllM_ = foldAllM_; exports.foldM = foldM; exports.foldM_ = foldM_; exports.fold_ = fold_; exports.get = get; exports.getAndSet = getAndSet; exports.getAndSet_ = getAndSet_; exports.getAndUpdate = getAndUpdate; exports.getAndUpdateSome = getAndUpdateSome; exports.getAndUpdateSome_ = getAndUpdateSome_; exports.getAndUpdate_ = getAndUpdate_; exports.makeManagedRefM = makeManagedRefM; exports.makeRefM = makeRefM; exports.map = map; exports.mapM = mapM; exports.mapM_ = mapM_; exports.map_ = map_; exports.modify = modify; exports.modifySome = modifySome; exports.modifySome_ = modifySome_; exports.modify_ = modify_; exports.readOnly = readOnly; exports.tapInput = tapInput; exports.tapInput_ = tapInput_; exports.tapOutput = tapOutput; exports.tapOutput_ = tapOutput_; exports.unsafeMakeRefM = unsafeMakeRefM; exports.update = update; exports.updateAndGet = updateAndGet; exports.updateAndGet_ = updateAndGet_; exports.updateSome = updateSome; exports.updateSomeAndGet = updateSomeAndGet; exports.updateSomeAndGet_ = updateSomeAndGet_; exports.updateSome_ = updateSome_; exports.update_ = update_; exports.writeOnly = writeOnly; var Tp = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../Collections/Immutable/Tuple/index.js")); var E = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../Either/index.js")); var _index3 = /*#__PURE__*/require("../Function/index.js"); var O = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../Option/index.js")); var Q = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../Queue/index.js")); var R = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../Ref/index.js")); var S = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../Semaphore/index.js")); var _index8 = /*#__PURE__*/require("../Utils/index.js"); var T = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("./effect.js")); var _XRefM = /*#__PURE__*/require("./XRefM.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 /** * Creates a new `XRefM` with the specified value. */ function makeRefM(a) { return T.map_(T.bind_(T.bind_(T.do, "ref", () => R.makeRef(a)), "semaphore", () => S.makeSemaphore(1)), ({ ref, semaphore }) => new _XRefM.AtomicM(ref, semaphore)); } /** * Creates a new `XRefM` with the specified value. */ function unsafeMakeRefM(a) { const ref = R.unsafeMakeRef(a); const semaphore = S.unsafeMakeSemaphore(1); return new _XRefM.AtomicM(ref, semaphore); } /** * Creates a new `RefM` with the specified value in the context of a * `Managed.` */ function makeManagedRefM(a) { return T.toManaged(makeRefM(a)); } /** * Creates a new `RefM` and a `Dequeue` that will emit every change to the * `RefM`. */ function dequeueRef(a) { return T.map_(T.bind_(T.bind_(T.do, "ref", () => makeRefM(a)), "queue", () => Q.makeUnbounded()), ({ queue, ref }) => [tapInput_(ref, a => Q.offer_(queue, a)), queue]); } /** * Atomically modifies the `RefM` with the specified function, which computes * a return value for the modification. This is a more powerful version of * `update`. */ function modify_(self, f) { return (0, _index8.matchTag)({ AtomicM: atomic => S.withPermit_(T.chain_(T.chain_(atomic.ref.get, f), ({ tuple: [b, a] }) => T.as_(atomic.ref.set(a), b)), atomic.semaphore), DerivedM: derived => derived.use((value, getEither, setEither) => S.withPermit_(T.chain_(value.ref.get, a => T.chain_(T.chain_(getEither(a), f), ({ tuple: [b, a] }) => T.as_(T.chain_(setEither(a), a => value.ref.set(a)), b))), value.semaphore)), DerivedAllM: derivedAll => derivedAll.use((value, getEither, setEither) => S.withPermit_(T.chain_(value.ref.get, s => T.chain_(T.chain_(getEither(s), f), ({ tuple: [b, a] }) => T.as_(T.chain_(setEither(a)(s), a => value.ref.set(a)), b))), value.semaphore)) })((0, _XRefM.concrete)(self)); } /** * Atomically modifies the `RefM` with the specified function, which computes * a return value for the modification. This is a more powerful version of * `update`. */ function modify(f) { return self => modify_(self, f); } /** * Reads the value from the `XRefM`. */ function get(self) { return self.get; } /** * Writes a new value to the `RefM`, returning the value immediately before * modification. */ function getAndSet_(self, a) { return modify_(self, v => T.succeed(Tp.tuple(v, a))); } /** * Writes a new value to the `RefM`, returning the value immediately before * modification. */ function getAndSet(a) { return self => getAndSet_(self, a); } /** * Atomically modifies the `RefM` with the specified function, returning the * value immediately before modification. */ function getAndUpdate_(self, f) { return modify_(self, v => T.map_(f(v), r => Tp.tuple(v, r))); } /** * Atomically modifies the `RefM` with the specified function, returning the * value immediately before modification. */ function getAndUpdate(f) { return self => getAndUpdate_(self, f); } /** * Atomically modifies the `RefM` with the specified function, returning the * value immediately before modification. */ function getAndUpdateSome_(self, f) { return modify_(self, v => T.map_(O.getOrElse_(f(v), () => T.succeed(v)), r => Tp.tuple(v, r))); } /** * Atomically modifies the `RefM` with the specified function, returning the * value immediately before modification. */ function getAndUpdateSome(f) { return self => getAndUpdateSome_(self, f); } /** * Atomically modifies the `RefM` with the specified function, which computes * a return value for the modification if the function is defined in the current value * otherwise it returns a default value. * This is a more powerful version of `updateSome`. */ function modifySome_(self, def, f) { return modify_(self, v => O.getOrElse_(f(v), () => T.succeed(Tp.tuple(def, v)))); } /** * Atomically modifies the `RefM` with the specified function, which computes * a return value for the modification if the function is defined in the current value * otherwise it returns a default value. * This is a more powerful version of `updateSome`. */ function modifySome(def) { return f => self => modifySome_(self, def, f); } /** * Atomically modifies the `RefM` with the specified function. */ function update_(self, f) { return modify_(self, v => T.map_(f(v), r => Tp.tuple(undefined, r))); } /** * Atomically modifies the `RefM` with the specified function. */ function update(f) { return self => update_(self, f); } /** * Atomically modifies the `RefM` with the specified function. */ function updateAndGet_(self, f) { return modify_(self, v => T.map_(f(v), r => Tp.tuple(r, r))); } /** * Atomically modifies the `RefM` with the specified function. */ function updateAndGet(f) { return self => updateAndGet_(self, f); } /** * Atomically modifies the `RefM` with the specified function. */ function updateSome_(self, f) { return modify_(self, v => T.map_(O.getOrElse_(f(v), () => T.succeed(v)), r => Tp.tuple(undefined, r))); } /** * Atomically modifies the `RefM` with the specified function. */ function updateSome(f) { return self => updateSome_(self, f); } /** * Atomically modifies the `RefM` with the specified function. */ function updateSomeAndGet_(self, f) { return modify_(self, v => T.map_(O.getOrElse_(f(v), () => T.succeed(v)), r => Tp.tuple(r, r))); } /** * Atomically modifies the `RefM` with the specified function. */ function updateSomeAndGet(f) { return self => updateSomeAndGet_(self, f); } /** * Folds over the error and value types of the `XRefM`. */ function fold_(self, ea, eb, ca, bd) { return self.foldM(ea, eb, c => T.fromEither(() => ca(c)), b => T.fromEither(() => bd(b))); } /** * Folds over the error and value types of the `XRefM`. */ function fold(ea, eb, ca, bd) { return self => self.foldM(ea, eb, c => T.fromEither(() => ca(c)), b => T.fromEither(() => bd(b))); } /** * Folds over the error and value types of the `XRefM`. This is a highly * polymorphic method that is capable of arbitrarily transforming the error * and value types of the `XRefM`. For most use cases one of the more * specific combinators implemented in terms of `foldM` will be more * ergonomic but this method is extremely useful for implementing new * combinators. */ function foldM_(self, ea, eb, ca, bd) { return self.foldM(ea, eb, ca, bd); } /** * Folds over the error and value types of the `XRefM`. This is a highly * polymorphic method that is capable of arbitrarily transforming the error * and value types of the `XRefM`. For most use cases one of the more * specific combinators implemented in terms of `foldM` will be more * ergonomic but this method is extremely useful for implementing new * combinators. */ function foldM(ea, eb, ca, bd) { return self => self.foldM(ea, eb, ca, bd); } /** * Folds over the error and value types of the `XRefM`, allowing access to * the state in transforming the `set` value. This is a more powerful version * of `foldM` but requires unifying the environment and error types. */ function foldAllM_(self, ea, eb, ec, ca, bd) { return self.foldAllM(ea, eb, ec, ca, bd); } /** * Folds over the error and value types of the `XRefM`, allowing access to * the state in transforming the `set` value. This is a more powerful version * of `foldM` but requires unifying the environment and error types. */ function foldAllM(ea, eb, ec, ca, bd) { return self => self.foldAllM(ea, eb, ec, ca, bd); } /** * Maps and filters the `get` value of the `XRefM` with the specified * effectual partial function, returning a `XRefM` with a `get` value that * succeeds with the result of the partial function if it is defined or else * fails with `None`. */ function collectM_(self, f) { return self.foldM(_index3.identity, _ => O.some(_), _ => T.succeed(_), b => O.getOrElse_(O.map_(f(b), a => T.asSomeError(a)), () => T.fail(O.none))); } /** * Maps and filters the `get` value of the `XRefM` with the specified * effectual partial function, returning a `XRefM` with a `get` value that * succeeds with the result of the partial function if it is defined or else * fails with `None`. */ function collectM(f) { return self => collectM_(self, f); } /** * Maps and filters the `get` value of the `XRefM` with the specified partial * function, returning a `XRefM` with a `get` value that succeeds with the * result of the partial function if it is defined or else fails with `None`. */ function collect_(self, f) { return collectM_(self, b => O.map_(f(b), T.succeed)); } /** * Maps and filters the `get` value of the `XRefM` with the specified partial * function, returning a `XRefM` with a `get` value that succeeds with the * result of the partial function if it is defined or else fails with `None`. */ function collect(f) { return self => collect_(self, f); } /** * Transforms both the `set` and `get` values of the `XRefM` with the * specified effectual functions. */ function dimapM_(self, f, g) { return self.foldM(ea => ea, eb => eb, f, g); } /** * Transforms both the `set` and `get` values of the `XRefM` with the * specified effectual functions. */ function dimapM(f, g) { return self => dimapM_(self, f, g); } /** * Transforms both the `set` and `get` errors of the `XRefM` with the * specified functions. */ function dimapError_(self, f, g) { return fold_(self, ea => f(ea), eb => g(eb), a => E.right(a), b => E.right(b)); } /** * Transforms both the `set` and `get` errors of the `XRefM` with the * specified functions. */ function dimapError(f, g) { return self => dimapError_(self, f, g); } /** * Filters the `set` value of the `XRefM` with the specified effectual * predicate, returning a `XRefM` with a `set` value that succeeds if the * predicate is satisfied or else fails with `None`. */ function filterInputM_(self, f) { return foldM_(self, ea => O.some(ea), _index3.identity, a => T.ifM_(T.asSomeError(f(a)), () => T.succeed(a), () => T.fail(O.none)), T.succeed); } /** * Filters the `set` value of the `XRefM` with the specified effectual * predicate, returning a `XRefM` with a `set` value that succeeds if the * predicate is satisfied or else fails with `None`. */ function filterInputM(f) { return self => filterInputM_(self, f); } /** * Filters the `set` value of the `XRefM` with the specified effectual * predicate, returning a `XRefM` with a `set` value that succeeds if the * predicate is satisfied or else fails with `None`. */ function filterInput_(self, f) { return filterInputM_(self, a => T.succeed(f(a))); } /** * Filters the `set` value of the `XRefM` with the specified effectual * predicate, returning a `XRefM` with a `set` value that succeeds if the * predicate is satisfied or else fails with `None`. */ function filterInput(f) { return self => filterInput_(self, f); } /** * Filters the `get` value of the `XRefM` with the specified effectual predicate, * returning a `XRefM` with a `get` value that succeeds if the predicate is * satisfied or else fails with `None`. */ function filterOutputM_(self, f) { return foldM_(self, ea => ea, eb => O.some(eb), a => T.succeed(a), b => T.ifM_(T.asSomeError(f(b)), () => T.succeed(b), () => T.fail(O.none))); } /** * Filters the `get` value of the `XRefM` with the specified effectual predicate, * returning a `XRefM` with a `get` value that succeeds if the predicate is * satisfied or else fails with `None`. */ function filterOutputM(f) { return self => filterOutputM_(self, f); } /** * Filters the `get` value of the `XRefM` with the specified predicate, * returning a `XRefM` with a `get` value that succeeds if the predicate is * satisfied or else fails with `None`. */ function filterOutput_(self, f) { return filterOutputM_(self, b => T.succeed(f(b))); } /** * Filters the `get` value of the `XRefM` with the specified predicate, * returning a `XRefM` with a `get` value that succeeds if the predicate is * satisfied or else fails with `None`. */ function filterOutput(f) { return self => filterOutput_(self, f); } /** * Transforms the `get` value of the `XRefM` with the specified effectual * function. */ function mapM_(self, f) { return dimapM_(self, T.succeed, f); } /** * Transforms the `get` value of the `XRefM` with the specified effectual * function. */ function mapM(f) { return self => mapM_(self, f); } /** * Transforms the `set` value of the `XRefM` with the specified effectual * function. */ function contramapM_(self, f) { return dimapM_(self, f, T.succeed); } /** * Transforms the `set` value of the `XRefM` with the specified effectual * function. */ function contramapM(f) { return self => contramapM_(self, f); } /** * Transforms the `set` value of the `XRefM` with the specified function. */ function contramap_(self, f) { return contramapM_(self, c => T.succeed(f(c))); } /** * Transforms the `set` value of the `XRefM` with the specified function. */ function contramap(f) { return self => contramap_(self, f); } /** * Transforms the `get` value of the `XRefM` with the specified function. */ function map_(self, f) { return mapM_(self, b => T.succeed(f(b))); } /** * Transforms the `get` value of the `XRefM` with the specified function. */ function map(f) { return self => map_(self, f); } /** * Returns a read only view of the `XRefM`. */ function readOnly(self) { return self; } /** * Returns a read only view of the `XRefM`. */ function writeOnly(self) { return fold_(self, _index3.identity, () => undefined, E.right, () => E.left(undefined)); } /** * Performs the specified effect every time a value is written to this * `XRefM`. */ function tapInput_(self, f) { return contramapM_(self, c => T.as_(f(c), c)); } /** * Performs the specified effect every time a value is written to this * `XRefM`. */ function tapInput(f) { return self => tapInput_(self, f); } /** * Performs the specified effect every time a value is read to this * `XRefM`. */ function tapOutput_(self, f) { return mapM_(self, b => T.as_(f(b), b)); } /** * Performs the specified effect every time a value is read to this * `XRefM`. */ function tapOutput(f) { return self => tapOutput_(self, f); } //# sourceMappingURL=api.js.map