UNPKG

state-synchronizers

Version:

Deterministically update state based on other state

40 lines (39 loc) 1.77 kB
"use strict"; 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; };