@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.
97 lines (96 loc) • 6.46 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs';
import { map, shareReplay } from 'rxjs/operators';
import * as i0 from "@angular/core";
/**
* @template T
*/
export 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);
}
}
function Model_tsickle_Closure_declarations() {
/** @type {?} */
Model.prototype._data;
/** @type {?} */
Model.prototype.data$;
}
/**
* @template T
*/
export 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 = i0.defineInjectable({ factory: function ModelFactory_Factory() { return new ModelFactory(); }, token: ModelFactory, providedIn: "root" });
function ModelFactory_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
ModelFactory.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
ModelFactory.ctorParameters;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AYW5ndWxhci1leHRlbnNpb25zL21vZGVsLyIsInNvdXJjZXMiOlsibW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFjLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOzs7OztBQUVsRCxNQUFNOzs7Ozs7O0lBS0osWUFDRSxXQUFnQixFQUNoQixTQUFrQixFQUNsQixrQkFBMkIsRUFDM0IsS0FBc0I7UUFFdEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLGVBQWUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxDQUN6QyxHQUFHLENBQ0QsQ0FBQyxJQUFPLEVBQUUsRUFBRSxDQUNWLFNBQVM7WUFDUCxDQUFDLENBQUMsS0FBSztnQkFDTCxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDYixDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQyxJQUFJLENBQ1gsRUFDRCxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFPLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUM3RCxDQUFDO0tBQ0g7Ozs7SUFFRCxHQUFHO1FBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQzlCOzs7OztJQUVELEdBQUcsQ0FBQyxJQUFPO1FBQ1QsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDdkI7Q0FDRjs7Ozs7Ozs7OztBQUtELE1BQU07Ozs7O0lBQ0osTUFBTSxDQUFDLFdBQWM7UUFDbkIsT0FBTyxJQUFJLEtBQUssQ0FBSSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQy9DOzs7OztJQUVELGFBQWEsQ0FBQyxXQUFjO1FBQzFCLE9BQU8sSUFBSSxLQUFLLENBQUksV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztLQUNoRDs7Ozs7SUFFRCxtQ0FBbUMsQ0FBQyxXQUFjO1FBQ2hELE9BQU8sSUFBSSxLQUFLLENBQUksV0FBVyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztLQUMvQzs7Ozs7O0lBRUQscUJBQXFCLENBQUMsV0FBYyxFQUFFLEtBQXFCO1FBQ3pELE9BQU8sSUFBSSxLQUFLLENBQUksV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDdEQ7OztZQWxCRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IG1hcCwgc2hhcmVSZXBsYXkgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmV4cG9ydCBjbGFzcyBNb2RlbDxUPiB7XG4gIHByaXZhdGUgX2RhdGE6IEJlaGF2aW9yU3ViamVjdDxUPjtcblxuICBkYXRhJDogT2JzZXJ2YWJsZTxUPjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBpbml0aWFsRGF0YTogYW55LFxuICAgIGltbXV0YWJsZTogYm9vbGVhbixcbiAgICBzaGFyZWRTdWJzY3JpcHRpb246IGJvb2xlYW4sXG4gICAgY2xvbmU/OiAoZGF0YTogVCkgPT4gVFxuICApIHtcbiAgICB0aGlzLl9kYXRhID0gbmV3IEJlaGF2aW9yU3ViamVjdChpbml0aWFsRGF0YSk7XG4gICAgdGhpcy5kYXRhJCA9IHRoaXMuX2RhdGEuYXNPYnNlcnZhYmxlKCkucGlwZShcbiAgICAgIG1hcChcbiAgICAgICAgKGRhdGE6IFQpID0+XG4gICAgICAgICAgaW1tdXRhYmxlXG4gICAgICAgICAgICA/IGNsb25lXG4gICAgICAgICAgICAgID8gY2xvbmUoZGF0YSlcbiAgICAgICAgICAgICAgOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGRhdGEpKVxuICAgICAgICAgICAgOiBkYXRhXG4gICAgICApLFxuICAgICAgc2hhcmVkU3Vic2NyaXB0aW9uID8gc2hhcmVSZXBsYXkoMSkgOiBtYXAoKGRhdGE6IFQpID0+IGRhdGEpXG4gICAgKTtcbiAgfVxuXG4gIGdldCgpOiBUIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YS5nZXRWYWx1ZSgpO1xuICB9XG5cbiAgc2V0KGRhdGE6IFQpIHtcbiAgICB0aGlzLl9kYXRhLm5leHQoZGF0YSk7XG4gIH1cbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgTW9kZWxGYWN0b3J5PFQ+IHtcbiAgY3JlYXRlKGluaXRpYWxEYXRhOiBUKTogTW9kZWw8VD4ge1xuICAgIHJldHVybiBuZXcgTW9kZWw8VD4oaW5pdGlhbERhdGEsIHRydWUsIGZhbHNlKTtcbiAgfVxuXG4gIGNyZWF0ZU11dGFibGUoaW5pdGlhbERhdGE6IFQpOiBNb2RlbDxUPiB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbDxUPihpbml0aWFsRGF0YSwgZmFsc2UsIGZhbHNlKTtcbiAgfVxuXG4gIGNyZWF0ZU11dGFibGVXaXRoU2hhcmVkU3Vic2NyaXB0aW9uKGluaXRpYWxEYXRhOiBUKTogTW9kZWw8VD4ge1xuICAgIHJldHVybiBuZXcgTW9kZWw8VD4oaW5pdGlhbERhdGEsIGZhbHNlLCB0cnVlKTtcbiAgfVxuXG4gIGNyZWF0ZVdpdGhDdXN0b21DbG9uZShpbml0aWFsRGF0YTogVCwgY2xvbmU6IChkYXRhOiBUKSA9PiBUKSB7XG4gICAgcmV0dXJuIG5ldyBNb2RlbDxUPihpbml0aWFsRGF0YSwgdHJ1ZSwgZmFsc2UsIGNsb25lKTtcbiAgfVxufVxuIl19