@platform/state
Version:
A small, simple, strongly typed, [rx/observable] state-machine.
55 lines (54 loc) • 1.95 kB
JavaScript
;
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;