UNPKG

@platform/state

Version:

A small, simple, strongly typed, [rx/observable] state-machine.

55 lines (54 loc) 1.95 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.create = void 0; var operators_1 = require("rxjs/operators"); var common_1 = require("../common"); function create(factory) { return function (initial, dispose$) { var initialStateObjects = []; initial = Object.keys(initial).reduce(function (acc, key) { var value = initial[key]; if (common_1.is.stateObject(value)) { acc[key] = value.state; initialStateObjects.push({ key: key, obj: value }); } else { acc[key] = value; } return acc; }, {}); var store = factory(initial); if (dispose$) { dispose$.subscribe(function () { return api.dispose(); }); } var change = function (key, to) { return store.change(function (draft) { return (draft[key] = to); }); }; var api = { store: store, get state() { return store.state; }, get changed$() { return store.event.changed$; }, add: function (key, subject) { var isObservable = common_1.is.observable(subject); var changed$ = isObservable ? subject : subject.event.changed$; if (!isObservable) { var obj = subject; change(key, obj.state); } changed$.pipe(operators_1.takeUntil(store.dispose$)).subscribe(function (e) { return change(key, e.to); }); return api; }, dispose: function () { return store.dispose(); }, }; initialStateObjects.forEach(function (_a) { var key = _a.key, obj = _a.obj; return api.add(key, obj); }); return api; }; } exports.create = create;