UNPKG

@angular-extensions/model

Version:

Angular Model - Simple state management with minimalistic API, one way data flow, multiple model support and immutable data exposed as RxJS Observable.

89 lines (85 loc) 5.76 kB
import { Injectable, defineInjectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; import { map, shareReplay } from 'rxjs/operators'; /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ /** * @template T */ class Model { /** * @param {?} initialData * @param {?} immutable * @param {?} sharedSubscription * @param {?=} clone */ constructor(initialData, immutable, sharedSubscription, clone) { this._data = new BehaviorSubject(initialData); this.data$ = this._data.asObservable().pipe(map((data) => immutable ? clone ? clone(data) : JSON.parse(JSON.stringify(data)) : data), sharedSubscription ? shareReplay(1) : map((data) => data)); } /** * @return {?} */ get() { return this._data.getValue(); } /** * @param {?} data * @return {?} */ set(data) { this._data.next(data); } } /** * @template T */ class ModelFactory { /** * @param {?} initialData * @return {?} */ create(initialData) { return new Model(initialData, true, false); } /** * @param {?} initialData * @return {?} */ createMutable(initialData) { return new Model(initialData, false, false); } /** * @param {?} initialData * @return {?} */ createMutableWithSharedSubscription(initialData) { return new Model(initialData, false, true); } /** * @param {?} initialData * @param {?} clone * @return {?} */ createWithCustomClone(initialData, clone) { return new Model(initialData, true, false, clone); } } ModelFactory.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] }, ]; /** @nocollapse */ ModelFactory.ngInjectableDef = defineInjectable({ factory: function ModelFactory_Factory() { return new ModelFactory(); }, token: ModelFactory, providedIn: "root" }); /** * @fileoverview added by tsickle * @suppress {checkTypes} checked by tsc */ export { Model, ModelFactory }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci1leHRlbnNpb25zLW1vZGVsLmpzLm1hcCIsInNvdXJjZXMiOlsibmc6Ly9AYW5ndWxhci1leHRlbnNpb25zL21vZGVsL21vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzaGFyZVJlcGxheSB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuZXhwb3J0IGNsYXNzIE1vZGVsPFQ+IHtcbiAgcHJpdmF0ZSBfZGF0YTogQmVoYXZpb3JTdWJqZWN0PFQ+O1xuXG4gIGRhdGEkOiBPYnNlcnZhYmxlPFQ+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIGluaXRpYWxEYXRhOiBhbnksXG4gICAgaW1tdXRhYmxlOiBib29sZWFuLFxuICAgIHNoYXJlZFN1YnNjcmlwdGlvbjogYm9vbGVhbixcbiAgICBjbG9uZT86IChkYXRhOiBUKSA9PiBUXG4gICkge1xuICAgIHRoaXMuX2RhdGEgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGluaXRpYWxEYXRhKTtcbiAgICB0aGlzLmRhdGEkID0gdGhpcy5fZGF0YS5hc09ic2VydmFibGUoKS5waXBlKFxuICAgICAgbWFwKFxuICAgICAgICAoZGF0YTogVCkgPT5cbiAgICAgICAgICBpbW11dGFibGVcbiAgICAgICAgICAgID8gY2xvbmVcbiAgICAgICAgICAgICAgPyBjbG9uZShkYXRhKVxuICAgICAgICAgICAgICA6IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoZGF0YSkpXG4gICAgICAgICAgICA6IGRhdGFcbiAgICAgICksXG4gICAgICBzaGFyZWRTdWJzY3JpcHRpb24gPyBzaGFyZVJlcGxheSgxKSA6IG1hcCgoZGF0YTogVCkgPT4gZGF0YSlcbiAgICApO1xuICB9XG5cbiAgZ2V0KCk6IFQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhLmdldFZhbHVlKCk7XG4gIH1cblxuICBzZXQoZGF0YTogVCkge1xuICAgIHRoaXMuX2RhdGEubmV4dChkYXRhKTtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBNb2RlbEZhY3Rvcnk8VD4ge1xuICBjcmVhdGUoaW5pdGlhbERhdGE6IFQpOiBNb2RlbDxUPiB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbDxUPihpbml0aWFsRGF0YSwgdHJ1ZSwgZmFsc2UpO1xuICB9XG5cbiAgY3JlYXRlTXV0YWJsZShpbml0aWFsRGF0YTogVCk6IE1vZGVsPFQ+IHtcbiAgICByZXR1cm4gbmV3IE1vZGVsPFQ+KGluaXRpYWxEYXRhLCBmYWxzZSwgZmFsc2UpO1xuICB9XG5cbiAgY3JlYXRlTXV0YWJsZVdpdGhTaGFyZWRTdWJzY3JpcHRpb24oaW5pdGlhbERhdGE6IFQpOiBNb2RlbDxUPiB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbDxUPihpbml0aWFsRGF0YSwgZmFsc2UsIHRydWUpO1xuICB9XG5cbiAgY3JlYXRlV2l0aEN1c3RvbUNsb25lKGluaXRpYWxEYXRhOiBULCBjbG9uZTogKGRhdGE6IFQpID0+IFQpIHtcbiAgICByZXR1cm4gbmV3IE1vZGVsPFQ+KGluaXRpYWxEYXRhLCB0cnVlLCBmYWxzZSwgY2xvbmUpO1xuICB9XG59XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFBQTs7O0FBSUE7Ozs7Ozs7SUFLRSxZQUNFLFdBQWdCLEVBQ2hCLFNBQWtCLEVBQ2xCLGtCQUEyQixFQUMzQixLQUFzQjtRQUV0QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLENBQ3pDLEdBQUcsQ0FDRCxDQUFDLElBQU8sS0FDTixTQUFTO2NBQ0wsS0FBSztrQkFDSCxLQUFLLENBQUMsSUFBSSxDQUFDO2tCQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztjQUNsQyxJQUFJLENBQ1gsRUFDRCxrQkFBa0IsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsSUFBTyxLQUFLLElBQUksQ0FBQyxDQUM3RCxDQUFDO0tBQ0g7Ozs7SUFFRCxHQUFHO1FBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQzlCOzs7OztJQUVELEdBQUcsQ0FBQyxJQUFPO1FBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDdkI7Q0FDRjs7OztBQUtEOzs7OztJQUNFLE1BQU0sQ0FBQyxXQUFjO1FBQ25CLE9BQU8sSUFBSSxLQUFLLENBQUksV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztLQUMvQzs7Ozs7SUFFRCxhQUFhLENBQUMsV0FBYztRQUMxQixPQUFPLElBQUksS0FBSyxDQUFJLFdBQVcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDaEQ7Ozs7O0lBRUQsbUNBQW1DLENBQUMsV0FBYztRQUNoRCxPQUFPLElBQUksS0FBSyxDQUFJLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDL0M7Ozs7OztJQUVELHFCQUFxQixDQUFDLFdBQWMsRUFBRSxLQUFxQjtRQUN6RCxPQUFPLElBQUksS0FBSyxDQUFJLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ3REOzs7WUFsQkYsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7Ozs7Ozs7OzsifQ==