v4.1.0-alpha.2 #517
markerikson
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
This alpha release updates
defaultMemoize
to accept new options for cache size > 1 and a result equality check, updatescreateSelector
to accept an options object containing options for the providedmemoize
function, improves some error messages, and addsmemoizedResultFunc
andlastResult
to the fields attached to the selector.These changes enable major improvements in functionality for
createSelector
, and should resolve almost all the concerns and pain points experienced by our users.Although marked as an alpha, the code should be stable and be ready to ship as 4.1.0 in the very near future pending feedback on any potential upgrade issues.
Changelog
New
defaultMemoize
OptionsdefaultMemoize
has always been fairly limited. Its signature was(func: Function, equalityCheck?: EqualityFn) => Function
, and only ever had a cache size of 1. This has led to many annoyances and workarounds, typically involving callingcreateSelectorCreator()
with a custom memoization function that has a larger cache size or more options for customizing comparisons.We've updated
defaultMemoize
to allow cache sizes > 1, as well as customize comparisons of the newly generated result value to improve cache hits.The signature for
defaultMemoize
is now:In other words, you can still pass
equalityCheck
as its one additional arg, or you may pass an object containing several possible options.If the
maxSize
value is greater than 1,defaultMemoize
will now use an LRU cache based on https://github.com/erikras/lru-memoize internally.If
resultEqualityCheck
is provided, it will be used to compare the newly-generated value fromfunc
against all other values in the cache, in LRU order. If a cached value is found to be equal, that value will be returned. This addresses the commontodos.map(todo => todo.id)
use case, where a change to any field in anytodo
object creates a newtodos
array and thus causes the output to be recalculated, but the generated IDs array is still shallow-equal to the last result. You can now pass an equality function likeshallowEqual
as theresultEqualityCheck
argument, and it will reuse the old IDs array instead.createSelector
OptionsPreviously, the only way to customize behavior of
createSelector
was to generate a customized version withcreateSelectorCreator
. By far the most common use case was customizing theequalityCheck
option used withdefaultMemoize
, or using a different memoizer entirely. This usually looked like:createSelectorCreator
also accepted additional positional parameters, and forwarded all of them to the providedmemoize
function, sodefaultMemoize
ultimately gets called internally asdefaultMemoize(actualFunction, shallowEqual)
.This added an annoying level of indirection to common customization use cases.
createSelector
now accepts an options object as its last argument, after the output selector. Currently, that object only includes one field:memoizeOptions
:Similar to how
createSelectorCreator
accepts additional "options args" that get forwarded to the memoization function, thememoizeOptions
field accepts an array of those "options args" as well. If provided, these override what was given tocreateSelectorCreator
.That means that you can now customize memoization behavior with direct options to
createSelector
. And, becausedefaultMemoize
now accepts more options, you can directly customizedefaultMemoize
's behavior without usingcreateSelectorCreator
.Additionally, because it's very common to only need to pass one options arg to the memoization function,
memoizeOptions
may also be just that first options arg by itself, without any array.Example usages of this look like:
This should make it much easier to customize behavior.
All of this is fully TypeScript-typed, and the possible values for
memoizeOptions
should be fully inferred from the providedmemoize
function.Additional Tweaks
We've improved the error messages thrown when invalid selectors are provided.
Generated selectors now include
selector.memoizedResultFunc
andselector.lastResult
for later access if needed.What's Changed
defaultMemoize
to accept options (maxSize, equalityCheck, resultEqualityCheck) by @markerikson in Update createSelector anddefaultMemoize
to accept options (maxSize, equalityCheck, resultEqualityCheck) #513New Contributors
Full Changelog: v4.1.0-alpha.1...v4.1.0-alpha.2
This discussion was created from the release v4.1.0-alpha.2.
Beta Was this translation helpful? Give feedback.
All reactions