Skip to content

Instantly share code, notes, and snippets.

@dtinth
Created August 17, 2017 17:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dtinth/e4329efd3882f926a134cb8a746d57a8 to your computer and use it in GitHub Desktop.
Save dtinth/e4329efd3882f926a134cb8a746d57a8 to your computer and use it in GitHub Desktop.
const memoizeArraySelector = (baseSelector) => {
let _last = [ ]
return (state) => {
const result = baseSelector(state)
if (arrayEquals(result, _last)) return _last
_last = result
return result
}
}
export const mapSelector = f => baseSelector => createSelector(baseSelector, f)
export const mapSelectorForArray = f => baseSelector => memoizeArraySelector(mapSelector(f)(baseSelector))
export const filteredBy = predicate => mapSelectorForArray(data => _.filter(data, predicate))
export const rejectedBy = predicate => mapSelectorForArray(data => _.reject(data, predicate))
export const sortedBy = sortBy => mapSelectorForArray(data => _.sortBy(data, sortBy))
export const sortedByOrder = (sortByOrder, direction) => mapSelectorForArray(data => _.orderBy(data, sortByOrder, direction))
@dtinth
Copy link
Author

dtinth commented Aug 19, 2017

@iboss-ptk

  • About flow type, yep I agreed that Flow/TypeScript type notation makes it look very scary.

  • About making memoizeSelector work with both array and non-array, I like it a lot.

  • Yes, it can be a Reader monad. For example, using createSelector to combine selectors can be considered a monadic operation:

    // Assume a selector is a fantasy-land monad instead of a (s => a) function.
    const combine2 = s1 => s2 => f => s1.chain(v1 => s2.map(v2 => f(v1, v2)))

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment