updux/src/buildSelectors/index.ts

31 lines
908 B
TypeScript
Raw Normal View History

2021-10-15 16:41:58 +00:00
import { map, mapValues, merge } from 'lodash';
2021-09-29 14:21:17 +00:00
2021-10-12 13:42:30 +00:00
export function buildSelectors(localSelectors, splatSelector, subduxes) {
2021-09-29 14:21:17 +00:00
const subSelectors = map(subduxes, ({ selectors }, slice) => {
if (!selectors) return {};
2021-10-12 13:42:30 +00:00
if (slice === '*') return {};
2021-09-29 14:21:17 +00:00
return mapValues(selectors, (func) => (state) => func(state[slice]));
});
2021-10-12 13:42:30 +00:00
let splat = {};
if (splatSelector) {
splat[splatSelector[0]] =
(state) =>
(...args) => {
const value = splatSelector[1](state)(...args);
const res = () => value;
return merge(
res,
mapValues(
subduxes['*'].selectors,
(selector) => () => selector(value)
)
);
};
}
return merge({}, ...subSelectors, localSelectors, splat);
2021-09-29 14:21:17 +00:00
}