@@ -11,6 +11,7 @@ interface Entry {
1111interface Cache {
1212 get ( key : any ) : Entry | undefined
1313 put ( key : any , value : any ) : void
14+ getValues ( ) : any [ ]
1415}
1516
1617function createSingletonCache ( equals : EqualityFn ) : Cache {
@@ -24,6 +25,10 @@ function createSingletonCache(equals: EqualityFn): Cache {
2425
2526 put ( key : any , value : any ) {
2627 entry = { key, value }
28+ } ,
29+
30+ getValues ( ) {
31+ return entry ? [ entry . value ] : [ ]
2732 }
2833 }
2934}
@@ -61,14 +66,18 @@ function createLruCache(maxSize: number, equals: EqualityFn): Cache {
6166 }
6267 }
6368
64- return { get, put }
69+ function getValues ( ) {
70+ return entries . map ( entry => entry . value )
71+ }
72+
73+ return { get, put, getValues }
6574}
6675
6776export const defaultEqualityCheck : EqualityFn = ( a , b ) : boolean => {
6877 return a === b
6978}
7079
71- function createCacheKeyComparator ( equalityCheck : EqualityFn ) {
80+ export function createCacheKeyComparator ( equalityCheck : EqualityFn ) {
7281 return function areArgumentsShallowlyEqual (
7382 prev : unknown [ ] | IArguments | null ,
7483 next : unknown [ ] | IArguments | null
@@ -95,8 +104,8 @@ export interface DefaultMemoizeOptions {
95104 maxSize ?: number
96105}
97106
98- // defaultMemoize now supports a configurable cache size and comparison of the result value.
99- // Updated behavior based on the `betterMemoize` function from
107+ // defaultMemoize now supports a configurable cache size with LRU behavior,
108+ // and optional comparison of the result value with existing values
100109export function defaultMemoize < F extends ( ...args : any [ ] ) => any > (
101110 func : F ,
102111 equalityCheckOrOptions ?: EqualityFn | DefaultMemoizeOptions
@@ -113,9 +122,6 @@ export function defaultMemoize<F extends (...args: any[]) => any>(
113122 } = providedOptions
114123
115124 const comparator = createCacheKeyComparator ( equalityCheck )
116- let resultComparator = resultEqualityCheck
117- ? createCacheKeyComparator ( resultEqualityCheck )
118- : undefined
119125
120126 const cache =
121127 maxSize === 1
@@ -128,6 +134,17 @@ export function defaultMemoize<F extends (...args: any[]) => any>(
128134 if ( value === undefined ) {
129135 // @ts -ignore
130136 value = func . apply ( null , arguments )
137+
138+ if ( resultEqualityCheck ) {
139+ const existingValues = cache . getValues ( )
140+ const matchingValue = existingValues . find ( ev =>
141+ resultEqualityCheck ( ev , value )
142+ )
143+ if ( matchingValue ) {
144+ return matchingValue
145+ }
146+ }
147+
131148 cache . put ( arguments , value )
132149 }
133150 return value
0 commit comments