@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
JavaScript
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==