Skip to content

Instantly share code, notes, and snippets.

@kbrownlees
Created February 4, 2016 02:28
Show Gist options
  • Save kbrownlees/8ed41ed6d86499b8c590 to your computer and use it in GitHub Desktop.
Save kbrownlees/8ed41ed6d86499b8c590 to your computer and use it in GitHub Desktop.
Dynamic reselect selector
export function createDynamicSelector() {
let subSelectors = null;
let actualSelector = null;
return (state, props, ...args) => {
// Check to see if the sub state has change
const subState = state.get('subState');
if (subSelectors === null || !Set(subState.keys()).equals(Set(subSelectors.keys()))) {
// Rebuild our the selectors - could obviously update if required.
subSelectors = subState.map((value, key) => {
return createSubSelector(
(state) => state.getIn(['subState', key])
)
});
actualSelector = createSelector(
...subSelectors.toArray(),
(...results) => {
// Merge / convert as required
return results;
}
)
}
return actualSelector(state, props, ...args);
};
}
export function createSubSelector(subSelector) {
return createSelector(
subSelector,
// Other selectors can still be in here!
(subSubState) => {
// Do stuff
return subSubState
}
)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment