-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmap.go
65 lines (51 loc) · 1.13 KB
/
map.go
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package types
import "sync"
// Map is a wrapper for sync.Map with same methods (except for CompareAnd*)
// Check: https://pkg.go.dev/sync#Map
type Map[K comparable, V any] struct {
store sync.Map
}
func (m *Map[K, V]) Store(k K, v V) {
m.store.Store(k, v)
}
func (m *Map[K, V]) Load(k K) (v V, ok bool) {
var a any
a, ok = m.store.Load(k)
if ok {
v = a.(V)
}
return
}
// Delete see sync.Map#Delete
func (m *Map[K, V]) Delete(k K) {
m.store.Delete(k)
}
// Range see sync.Map#Range
func (m *Map[K, V]) Range(f func(k K, v V) bool) {
m.store.Range(func(k, v any) bool {
return f(k.(K), v.(V))
})
}
// LoadAndDelete see sync.Map#LoadAndDelete
func (m *Map[K, V]) LoadAndDelete(k K) (v V, loaded bool) {
var a any
a, loaded = m.store.LoadAndDelete(k)
if loaded {
v = a.(V)
}
return
}
// LoadOrStore see sync.Map#LoadOrStore
func (m *Map[K, V]) LoadOrStore(k K, v V) (actual V, loaded bool) {
var a any
a, loaded = m.store.LoadOrStore(k, v)
actual = a.(V)
return
}
// Swap see sync.Map#Swap
func (m *Map[K, V]) Swap(k K, v V) (previous V, loaded bool) {
var a any
a, loaded = m.store.Swap(k, v)
previous, _ = a.(V)
return
}