state-synchronizers
Version:
Deterministically update state based on other state
40 lines (39 loc) • 1.77 kB
JavaScript
;
exports.__esModule = true;
exports.composeStateSynchronizers = void 0;
var topological_sorting_1 = require("./topological-sorting");
exports.composeStateSynchronizers = function (stateSynchronizers) {
var edges = getEdges(stateSynchronizers);
var synchronizersForState = getSynchronizersForState(stateSynchronizers);
var orderOfSynchronizers = topological_sorting_1.getTopologicalSorting(edges).filter(function (stateKey) { return !!synchronizersForState[stateKey]; });
var orderedSynchronizers = orderOfSynchronizers.flatMap(function (stateKey) { return synchronizersForState[stateKey]; });
return function (state, previousState) {
var lastState = state;
orderedSynchronizers.forEach(function (synchronizer) { return (lastState = synchronizer(lastState, previousState)); });
return lastState;
};
};
var getEdges = function (stateSynchronizers) {
var edges = {};
stateSynchronizers.forEach(function (_a) {
var stateKey = _a.stateKey, dependenciesKeys = _a.dependenciesKeys;
dependenciesKeys.forEach(function (dependencyKey) {
if (!edges[dependencyKey]) {
edges[dependencyKey] = [];
}
edges[dependencyKey].push(stateKey);
});
});
return edges;
};
var getSynchronizersForState = function (stateSynchronizers) {
var synchronizersForState = {};
stateSynchronizers.forEach(function (_a) {
var stateKey = _a.stateKey, synchronizer = _a.synchronizer;
if (!synchronizersForState[stateKey]) {
synchronizersForState[stateKey] = [];
}
synchronizersForState[stateKey].push(synchronizer);
});
return synchronizersForState;
};