UNPKG

@effect-ts/system

Version:

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

435 lines (343 loc) 11.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.STMTypeId = exports.STMSucceedTypeId = exports.STMSucceedNowTypeId = exports.STMSucceedNow = exports.STMSucceed = exports.STMRetryException = exports.STMProvideSomeTypeId = exports.STMProvideSome = exports.STMOnSuccessTypeId = exports.STMOnSuccess = exports.STMOnRetryTypeId = exports.STMOnRetry = exports.STMOnFailureTypeId = exports.STMOnFailure = exports.STMFailException = exports.STMEffectTypeId = exports.STMEffect = exports.STMDieException = exports.STM = exports.RetryExceptionTypeId = exports.FailExceptionTypeId = exports.DieExceptionTypeId = void 0; exports.catchAll = catchAll; exports.catchAll_ = catchAll_; exports.chain = chain; exports.chain_ = chain_; exports.concreteSTM = concreteSTM; exports.die = die; exports.dieWith = dieWith; exports.ensuring = ensuring; exports.ensuring_ = ensuring_; exports.fail = fail; exports.failWith = failWith; exports.foldM = foldM; exports.foldM_ = foldM_; exports.isDieException = isDieException; exports.isFailException = isFailException; exports.isRetryException = isRetryException; exports.map = map; exports.map_ = map_; exports.provideSome = provideSome; exports.provideSome_ = provideSome_; exports.retry = void 0; exports.succeed = succeed; exports.succeedWith = succeedWith; exports.unit = void 0; var T = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../../../Effect/index.js")); var E = /*#__PURE__*/_interopRequireWildcard( /*#__PURE__*/require("../../../Either/index.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; } var _a; // ets_tracing: off const STMTypeId = /*#__PURE__*/Symbol(); /** * `STM<R, E, A>` represents an effect that can be performed transactionally, * resulting in a failure `E` or a value `A` that may require an environment * `R` to execute. * * Software Transactional Memory is a technique which allows composition of arbitrary atomic operations. It is * the software analog of transactions in database systems. * * The API is lifted directly from the Haskell package Control.Concurrent.STM although the implementation does not * resemble the Haskell one at all. * [[http://hackage.haskell.org/package/stm-2.5.0.0/docs/Control-Concurrent-STM.html]] * * STM in Haskell was introduced in: * Composable memory transactions, by Tim Harris, Simon Marlow, Simon Peyton Jones, and Maurice Herlihy, in ACM * Conference on Principles and Practice of Parallel Programming 2005. * [[https://www.microsoft.com/en-us/research/publication/composable-memory-transactions/]] * * See also: * Lock Free Data Structures using STMs in Haskell, by Anthony Discolo, Tim Harris, Simon Marlow, Simon Peyton Jones, * Satnam Singh) FLOPS 2006: Eighth International Symposium on Functional and Logic Programming, Fuji Susono, JAPAN, * April 2006 * [[https://www.microsoft.com/en-us/research/publication/lock-free-data-structures-using-stms-in-haskell/]] * * The implemtation is based on the ZIO STM module, while JS environments have no race conditions from multiple threads * STM provides greater benefits for syncronisation of Fibers and transactional data-types can be quite useful. */ exports.STMTypeId = STMTypeId; class STM { constructor() { this[_a] = STMTypeId; } } exports.STM = STM; _a = STMTypeId, T._R, T._E, T._A; const STMEffectTypeId = /*#__PURE__*/Symbol(); exports.STMEffectTypeId = STMEffectTypeId; class STMEffect extends STM { constructor(f) { super(); this.f = f; this._typeId = STMEffectTypeId; } } exports.STMEffect = STMEffect; const STMOnFailureTypeId = /*#__PURE__*/Symbol(); exports.STMOnFailureTypeId = STMOnFailureTypeId; class STMOnFailure extends STM { constructor(stm, onFailure) { super(); this.stm = stm; this.onFailure = onFailure; this._typeId = STMOnFailureTypeId; } apply(a) { return new STMSucceedNow(a); } } exports.STMOnFailure = STMOnFailure; const STMOnRetryTypeId = /*#__PURE__*/Symbol(); exports.STMOnRetryTypeId = STMOnRetryTypeId; class STMOnRetry extends STM { constructor(stm, onRetry) { super(); this.stm = stm; this.onRetry = onRetry; this._typeId = STMOnRetryTypeId; } apply(a) { return new STMSucceedNow(a); } } exports.STMOnRetry = STMOnRetry; const STMOnSuccessTypeId = /*#__PURE__*/Symbol(); exports.STMOnSuccessTypeId = STMOnSuccessTypeId; class STMOnSuccess extends STM { constructor(stm, apply) { super(); this.stm = stm; this.apply = apply; this._typeId = STMOnSuccessTypeId; } } exports.STMOnSuccess = STMOnSuccess; const STMSucceedTypeId = /*#__PURE__*/Symbol(); exports.STMSucceedTypeId = STMSucceedTypeId; class STMSucceed extends STM { constructor(a) { super(); this.a = a; this._typeId = STMSucceedTypeId; } } exports.STMSucceed = STMSucceed; const STMSucceedNowTypeId = /*#__PURE__*/Symbol(); exports.STMSucceedNowTypeId = STMSucceedNowTypeId; class STMSucceedNow extends STM { constructor(a) { super(); this.a = a; this._typeId = STMSucceedNowTypeId; } } exports.STMSucceedNow = STMSucceedNow; const STMProvideSomeTypeId = /*#__PURE__*/Symbol(); exports.STMProvideSomeTypeId = STMProvideSomeTypeId; class STMProvideSome extends STM { constructor(stm, f) { super(); this.stm = stm; this.f = f; this._typeId = STMProvideSomeTypeId; } } /** * @ets_optimize remove */ exports.STMProvideSome = STMProvideSome; function concreteSTM(_) {// } const FailExceptionTypeId = /*#__PURE__*/Symbol(); exports.FailExceptionTypeId = FailExceptionTypeId; class STMFailException { constructor(e) { this.e = e; this._typeId = FailExceptionTypeId; } } exports.STMFailException = STMFailException; function isFailException(u) { return typeof u === "object" && u != null && "_typeId" in u && u["_typeId"] === FailExceptionTypeId; } const DieExceptionTypeId = /*#__PURE__*/Symbol(); exports.DieExceptionTypeId = DieExceptionTypeId; class STMDieException { constructor(e) { this.e = e; this._typeId = DieExceptionTypeId; } } exports.STMDieException = STMDieException; function isDieException(u) { return typeof u === "object" && u != null && "_typeId" in u && u["_typeId"] === DieExceptionTypeId; } const RetryExceptionTypeId = /*#__PURE__*/Symbol(); exports.RetryExceptionTypeId = RetryExceptionTypeId; class STMRetryException { constructor() { this._typeId = RetryExceptionTypeId; } } exports.STMRetryException = STMRetryException; function isRetryException(u) { return typeof u === "object" && u != null && "_typeId" in u && u["_typeId"] === RetryExceptionTypeId; } // // primitive ops // /** * Returns an `STM` effect that succeeds with the specified value. */ function succeed(a) { return new STMSucceedNow(a); } /** * Returns an `STM` effect that succeeds with the specified value. */ function succeedWith(a) { return new STMSucceed(a); } /** * Returns a value that models failure in the transaction. */ function fail(e) { return new STMEffect(() => { throw new STMFailException(e); }); } /** * Returns a value that models failure in the transaction. */ function failWith(e) { return new STMEffect(() => { throw new STMFailException(e()); }); } /** * Kills the fiber running the effect. */ function die(u) { return new STMEffect(() => { throw new STMDieException(u); }); } /** * Kills the fiber running the effect. */ function dieWith(u) { return new STMEffect(() => { throw new STMDieException(u()); }); } /** * Maps the value produced by the effect. */ function map_(self, f) { return chain_(self, a => succeed(f(a))); } /** * Maps the value produced by the effect. * * @ets_data_first map_ */ function map(f) { return self => map_(self, f); } /** * Feeds the value produced by this effect to the specified function, * and then runs the returned effect as well to produce its results. */ function chain_(self, f) { return new STMOnSuccess(self, f); } /** * Feeds the value produced by this effect to the specified function, * and then runs the returned effect as well to produce its results. * * @ets_data_first chain_ */ function chain(f) { return self => chain_(self, f); } /** * Recovers from all errors. */ function catchAll_(self, f) { return new STMOnFailure(self, f); } /** * Recovers from all errors. * * @ets_data_first catchAll_ */ function catchAll(f) { return self => catchAll_(self, f); } /** * Effectfully folds over the `STM` effect, handling both failure and * success. */ function foldM_(self, g, f) { return chain_(catchAll_(map_(self, E.right), e => map_(g(e), E.left)), E.fold(succeed, f)); } /** * Effectfully folds over the `STM` effect, handling both failure and * success. * * @ets_data_first foldM_ */ function foldM(g, f) { return self => foldM_(self, g, f); } /** * Executes the specified finalization transaction whether or * not this effect succeeds. Note that as with all STM transactions, * if the full transaction fails, everything will be rolled back. */ function ensuring_(self, finalizer) { return foldM_(self, e => chain_(finalizer, () => fail(e)), a => chain_(finalizer, () => succeed(a))); } /** * Executes the specified finalization transaction whether or * not this effect succeeds. Note that as with all STM transactions, * if the full transaction fails, everything will be rolled back. * * @ets_data_first ensuring_ */ function ensuring(finalizer) { return self => ensuring_(self, finalizer); } /** * Abort and retry the whole transaction when any of the underlying * transactional variables have changed. */ const retry = /*#__PURE__*/new STMEffect(() => { throw new STMRetryException(); }); /** * Returns an `STM` effect that succeeds with `Unit`. */ exports.retry = retry; const unit = /*#__PURE__*/succeed(undefined); /** * Provides some of the environment required to run this effect, * leaving the remainder `R0`. */ exports.unit = unit; function provideSome_(self, f) { return new STMProvideSome(self, f); } /** * Provides some of the environment required to run this effect, * leaving the remainder `R0`. * * @ets_data_first provideSome_ */ function provideSome(f) { return self => provideSome_(self, f); } //# sourceMappingURL=primitives.js.map