UNPKG

@fraktalio/fmodel-ts

Version:

Functional domain modeling with TypeScript. Optimized for event sourcing and CQRS

69 lines 3.79 kB
"use strict"; /* * Copyright 2023 Fraktalio D.O.O. All rights reserved. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the * License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an " * AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific * language governing permissions and limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.Saga = void 0; /** * `Saga` is a datatype that represents the central point of control deciding what to execute next `A`. * It is responsible for mapping different events from aggregates into action results `AR` that the `Saga` then can use to calculate the next actions `A` to be mapped to command of other aggregates. * * @typeParam AR - Action Result type * @typeParam A - Action type * * @author Иван Дугалић / Ivan Dugalic / @idugalic */ class Saga { /** * @constructor Creates `Saga` * @param react - A function/lambda that takes input state of type `AR`, and returns the list of actions `A[]`>. */ constructor(react) { this.react = react; } /** * Left map on `AR`/ActionResult parameter - Contravariant * * @typeParam ARn - New Action Result */ mapContraOnActionResult(f) { return new Saga((arn) => this.react(f(arn))); } /** * Right map on `A`/Action parameter - Covariant * * @typeParam An - New Action */ mapOnAction(f) { return new Saga((ar) => this.react(ar).map(f)); } /** * Combines two choreography sagas into one orchestrating Saga * * @param saga2 - second Saga */ combine(saga2) { const sagaX = this.mapContraOnActionResult((en) => en).mapOnAction(identity); const sagaY = saga2 .mapContraOnActionResult((en) => en) .mapOnAction(identity); return new Saga((ar) => sagaX.react(ar).concat(sagaY.react(ar))); } } exports.Saga = Saga; /** * Identity function * * @param t - some type */ const identity = (t) => t; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2FnYS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvZG9tYWluL3NhZ2EudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7OztHQVdHOzs7QUFpQkg7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFhLElBQUk7SUFDZjs7O09BR0c7SUFDSCxZQUFxQixLQUF5QztRQUF6QyxVQUFLLEdBQUwsS0FBSyxDQUFvQztJQUFHLENBQUM7SUFFbEU7Ozs7T0FJRztJQUNILHVCQUF1QixDQUFNLENBQW1CO1FBQzlDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILFdBQVcsQ0FBSyxDQUFlO1FBQzdCLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxPQUFPLENBQVUsS0FBb0I7UUFDbkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLHVCQUF1QixDQUN4QyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBUSxDQUNqQixDQUFDLFdBQVcsQ0FBUyxRQUFRLENBQUMsQ0FBQztRQUVoQyxNQUFNLEtBQUssR0FBRyxLQUFLO2FBQ2hCLHVCQUF1QixDQUFXLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFTLENBQUM7YUFDcEQsV0FBVyxDQUFTLFFBQVEsQ0FBQyxDQUFDO1FBRWpDLE9BQU8sSUFBSSxJQUFJLENBQW1CLENBQUMsRUFBWSxFQUFFLEVBQUUsQ0FDakQsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUN4QyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBM0NELG9CQTJDQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFFBQVEsR0FBRyxDQUFJLENBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDIn0=