UNPKG

rxjs-observable-store

Version:

A state management solution implemented using RxJS to mimic Redux architecture.

79 lines (78 loc) 2.82 kB
var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; import { BehaviorSubject } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; var Store = /** @class */ (function () { function Store(initialState) { this._state$ = new BehaviorSubject(initialState); this.state$ = this._state$.asObservable(); } Object.defineProperty(Store.prototype, "state", { get: function () { return this._state$.getValue(); }, enumerable: false, configurable: true }); Store.prototype.setState = function (nextState) { this._state$.next(nextState); }; Store.prototype.patchState = function (value) { var path = []; for (var _i = 1; _i < arguments.length; _i++) { path[_i - 1] = arguments[_i]; } if (path.length < 1) { return; } this.setState(this.getUpdatedState(value, this.state, path)); }; Store.prototype.onChanges = function () { var path = []; for (var _i = 0; _i < arguments.length; _i++) { path[_i] = arguments[_i]; } return this.state$.pipe(map(function (state) { return path.reduce(function (result, part) { if (result === undefined || result === null) { return undefined; } return result[part]; }, state); }), distinctUntilChanged()); }; Store.prototype.getUpdatedState = function (value, stateSubtree, path) { var _a, _b, _c; var key = path[0]; if (path.length === 1) { return __assign(__assign({}, stateSubtree), (_a = {}, _a[key] = value, _a)); } if (stateSubtree[key] === undefined || stateSubtree[key] === null) { return __assign(__assign({}, stateSubtree), (_b = {}, _b[key] = this.createStateSubtree(value, path.slice(1)), _b)); } return __assign(__assign({}, stateSubtree), (_c = {}, _c[key] = this.getUpdatedState(value, stateSubtree[key], path.slice(1)), _c)); }; Store.prototype.createStateSubtree = function (value, path) { var _a, _b; var key = path[0]; if (path.length === 1) { return _a = {}, _a[key] = value, _a; } return _b = {}, _b[key] = this.createStateSubtree(value, path.slice(1)), _b; }; return Store; }()); export { Store };