@@ -522,29 +522,31 @@ func (lru *LRU[K, V]) getAndRefresh(hash uint32, key K) (value V, ok bool) {
522522 return
523523}
524524
525- func (lru * LRU [K , V ]) GetAndRefreshOrAdd (key K , constructor func () (V , bool )) (V , bool ) {
526- return lru .getAndRefreshOrAdd (lru .hash (key ), key , constructor )
525+ func (lru * LRU [K , V ]) GetAndRefreshOrAdd (key K , constructor func () (V , bool )) (V , bool , bool ) {
526+ value , updated , ok := lru .getAndRefreshOrAdd (lru .hash (key ), key , constructor )
527+ if ! updated && ok {
528+ lru .PurgeExpired ()
529+ }
530+ return value , updated , ok
527531}
528532
529- func (lru * LRU [K , V ]) getAndRefreshOrAdd (hash uint32 , key K , constructor func () (V , bool )) (value V , ok bool ) {
533+ func (lru * LRU [K , V ]) getAndRefreshOrAdd (hash uint32 , key K , constructor func () (V , bool )) (value V , updated bool , ok bool ) {
530534 if pos , ok := lru .findKeyNoExpire (hash , key ); ok {
531535 if pos != lru .head {
532536 lru .unlinkElement (pos )
533537 lru .setHead (pos )
534538 }
535539 lru .metrics .Hits ++
536540 lru .elements [pos ].expire = expire (lru .lifetime )
537- return lru .elements [pos ].value , ok
541+ return lru .elements [pos ].value , true , true
538542 }
539-
540543 lru .metrics .Misses ++
541544 value , ok = constructor ()
542545 if ! ok {
543546 return
544547 }
545548 lru .addWithLifetime (hash , key , value , lru .lifetime )
546- lru .PurgeExpired ()
547- return value , false
549+ return value , false , true
548550}
549551
550552// Peek looks up a key's value from the cache, without changing its recent-ness.
0 commit comments