blob: f10da5f4fbc3f815370ac98978a5d350af2d40ff (
about) (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
package mru
// Sync reconciles the order's membership to present.
//
// Surviving keys keep their relative recency order,
// absent keys are dropped,
// and newly present keys are placed before the survivors,
// since new members are presumed recently used.
func (order *Order[K]) Sync(present map[K]struct{}) {
order.mu.Lock()
defer order.mu.Unlock()
keys := order.Keys()
survivors := make(map[K]struct{}, len(present))
for _, key := range keys {
if _, ok := present[key]; ok {
survivors[key] = struct{}{}
}
}
next := make([]K, 0, len(present))
for key := range present {
if _, ok := survivors[key]; !ok {
next = append(next, key)
}
}
for _, key := range keys {
if _, ok := survivors[key]; ok {
next = append(next, key)
}
}
order.snapshot.Store(&next)
}
|