Skip to content

Commit d3c8d1f

Browse files
authored
Merge pull request #5 from tstromberg/main
Implement key/value iteration
2 parents df0e7df + 4b05bd9 commit d3c8d1f

File tree

8 files changed

+634
-187
lines changed

8 files changed

+634
-187
lines changed

experiment_results.md

Lines changed: 0 additions & 187 deletions
This file was deleted.

memory.go

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
package fido
33

44
import (
5+
"iter"
56
"sync"
67
"time"
78

@@ -138,6 +139,32 @@ func (c *Cache[K, V]) Flush() int {
138139
return c.memory.flush()
139140
}
140141

142+
// Range returns an iterator over all non-expired key-value pairs.
143+
// Iteration order is undefined. Safe for concurrent use.
144+
// Changes during iteration may or may not be reflected.
145+
func (c *Cache[K, V]) Range() iter.Seq2[K, V] {
146+
return func(yield func(K, V) bool) {
147+
//nolint:gosec // G115: Unix seconds fit in uint32 until year 2106
148+
now := uint32(time.Now().Unix())
149+
c.memory.entries.Range(func(key K, e *entry[K, V]) bool {
150+
// Skip expired entries.
151+
expiry := e.expirySec.Load()
152+
if expiry != 0 && expiry < now {
153+
return true
154+
}
155+
156+
// Load value with seqlock.
157+
v, ok := e.loadValue()
158+
if !ok {
159+
return true
160+
}
161+
162+
// Yield to caller.
163+
return yield(key, v)
164+
})
165+
}
166+
}
167+
141168
type config struct {
142169
size int
143170
defaultTTL time.Duration

0 commit comments

Comments
 (0)