updux/src/selectors.js

40 lines
1017 B
JavaScript

import R from 'remeda';
export function buildSelectors(
localSelectors,
splatSelector = {},
subduxes = {},
) {
const subSelectors = Object.entries(subduxes).map(
([slice, { selectors }]) => {
if (!selectors) return {};
if (slice === '*') return {};
return R.mapValues(
selectors,
(func) => (state) => func(state[slice]),
);
},
);
let splat = {};
for (const name in splatSelector) {
splat[name] =
(state) =>
(...args) => {
const value = splatSelector[name](state)(...args);
const res = () => value;
return merge(
res,
mapValues(
subduxes['*'].selectors,
(selector) => () => selector(value),
),
);
};
}
return R.mergeAll([...subSelectors, localSelectors, splat]);
}