38 lines
971 B
JavaScript
38 lines
971 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 ]);
|
|
}
|