Last active
June 26, 2017 00:07
-
-
Save ben196888/cd9c1b2c80717df1b6d282cdd46a844c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Common part | |
// index.js | |
import { combineReducer } from 'redux'; | |
import reducer from './reducer'; | |
export default combineReducer({ | |
deep: reducer, | |
}); | |
// reducer.js | |
import { combineReducer } from 'redux'; | |
const idsReducer = (state = EMPTY_LIST, action) => { | |
// store array of id | |
}; | |
const byIdReducer = (state = EMPTY_MAP, action) => { | |
// store entities by id | |
}; | |
export default combineReducer({ | |
ids: idsReducer, | |
byId: byIdReducer, | |
}); | |
// 1.1 | |
// index.js | |
export const selector = (state, props) => innerSelector(state.deep, ...props); | |
// reducer.js | |
export const innerSelector = (state, id) => ( | |
state.byId[id] | |
); | |
// 1.2 | |
// index.js | |
export const selector = (state, props) => innerSelector(state.deep, props); | |
// reducer.js | |
export const innerSelector = (state, props) => ( | |
state.byId[props.id] | |
); | |
// 2.1 | |
// index.js | |
export const selector => innerSelector; | |
// reducer.js | |
const stateWrapper = (state) => (state.deep); | |
export const innerSeletor = (state, id) => ( | |
stateWrapper(state).byId[id] | |
); | |
// 2.2 | |
// index.js | |
export const selector => innerSelector; | |
// reducer.js | |
const stateWrapper = (state) => (state.deep); | |
export const innerSeletor = (state, props) => ( | |
stateWrapper(state).byId[props.id] | |
); | |
// 3.1 | |
// index.js | |
const selectorName = { | |
deep: innerSelector, | |
}; | |
export const select = (name, state, props) => { | |
const selectorFunc = selectorName(name); | |
if (selectorFunc) { | |
return selectorFunc(state.deep, props); | |
} | |
return null; | |
}; | |
// reducer.js | |
export const innerSelector = (state, props) => ( | |
state.byId[props.id] | |
); | |
// 3.2 | |
// index.js | |
const selectorName = { | |
innerSelector: innerSelector, | |
}; | |
export const select = (name, state, ...props) => { | |
const selectorFunc = selectorName(name); | |
if (selectorFunc) { | |
return selectorFunc(state.deep, ...props); | |
} | |
return null; | |
}; | |
// reducer.js | |
export const innerSelector = (state, id) => ( | |
state.byId[id] | |
); | |
// 3.3 | |
// index.js | |
const selectorName = { | |
deep: innerSelector, | |
}; | |
export const select = (name, state, props) => { | |
const reducerName = name.split('__')[0]; | |
const trimName = name.slice((reducerName + '__').length); | |
const deeperSelector = selectorName(reducerName); | |
if (deeperSelector) { | |
return deeperSelector(trimName, state[reducerName], props); | |
} | |
const selector = selectorName(trimName); | |
if (selector) { | |
return selector(state, props); | |
} | |
return null; | |
}; | |
// reducer.js | |
export const innerSelector = (state, props) => ( | |
state.byId[props.id] | |
); | |
// 4. | |
// index.js | |
const innerSelectors = [ | |
selectorName: innerSelector, reducerName: 'deep' | |
]; | |
export const selectors = innerSelectors.reduce((acc, { selectorName, reducerName }) => ({ | |
...acc, | |
[selectorName]: (state, ...props) => selectorName(state[reducerName], ...props), | |
}), {}); | |
// reducer.js | |
const innerSelector = (state, id) => ( | |
state.byId[id] | |
); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment