sac.js 1.1 KB

1234567891011121314151617181920212223242526272829
  1. import {decow, deget} from './cow-value-model';
  2. export const subReducer = (key, reducer, ...otherKeys) => {
  3. const selector = deget(key),
  4. modifier = decow(key),
  5. otherParts = otherKeys.map(deget);
  6. return (state, action) => {
  7. let newSubState = reducer(selector(state), action, ...otherParts.map(eachSelector => eachSelector(state)));
  8. if (typeof newSubState === "undefined") {
  9. throw new Error(`The '${key}' reducer must not return undefined.`);
  10. }
  11. return modifier(newSubState)(state);
  12. };
  13. };
  14. export const composeReducers = (...reducers) => (state, action) =>
  15. reducers.reduce((x, r) => r(x, action), state);
  16. export const subMiddleware = (keyOrSelectorFn, middleware) => {
  17. const selector = typeof keyOrSelectorFn === "function" ? keyOrSelectorFn : deget(keyOrSelectorFn);
  18. return (store, ...rest) => {
  19. const {getState} = store;
  20. return middleware({...store, getState: () => selector(getState())}, ...rest);
  21. };
  22. };
  23. export const subEffex = (keyOrSelectorFn, effects) =>
  24. effects.map(each => ({...each, effect: subMiddleware(keyOrSelectorFn, each.effect)}));