mirror of
https://github.com/lightningnetwork/lnd.git
synced 2024-11-19 09:53:54 +01:00
692cd4bc4f
This commit moves the `SyncMap` from `lntemp/node` into `lnutils` so it can be used by other packages.
54 lines
1.4 KiB
Go
54 lines
1.4 KiB
Go
package lnutils
|
|
|
|
import "sync"
|
|
|
|
// SyncMap wraps a sync.Map with type parameters such that it's easier to
|
|
// access the items stored in the map since no type assertion is needed. It
|
|
// also requires explicit type definition when declaring and initiating the
|
|
// variables, which helps us understanding what's stored in a given map.
|
|
type SyncMap[K comparable, V any] struct {
|
|
sync.Map
|
|
}
|
|
|
|
// Store puts an item in the map.
|
|
func (m *SyncMap[K, V]) Store(key K, value V) {
|
|
m.Map.Store(key, value)
|
|
}
|
|
|
|
// Load queries an item from the map using the specified key. If the item
|
|
// cannot be found, an empty value and false will be returned. If the stored
|
|
// item fails the type assertion, a nil value and false will be returned.
|
|
func (m *SyncMap[K, V]) Load(key K) (V, bool) {
|
|
result, ok := m.Map.Load(key)
|
|
if !ok {
|
|
return *new(V), false // nolint: gocritic
|
|
}
|
|
|
|
item, ok := result.(V)
|
|
return item, ok
|
|
}
|
|
|
|
// Delete removes an item from the map specified by the key.
|
|
func (m *SyncMap[K, V]) Delete(key K) {
|
|
m.Map.Delete(key)
|
|
}
|
|
|
|
// LoadAndDelete queries an item and deletes it from the map using the
|
|
// specified key.
|
|
func (m *SyncMap[K, V]) LoadAndDelete(key K) (V, bool) {
|
|
result, loaded := m.Map.LoadAndDelete(key)
|
|
if !loaded {
|
|
return *new(V), loaded // nolint: gocritic
|
|
}
|
|
|
|
item, ok := result.(V)
|
|
return item, ok
|
|
}
|
|
|
|
// Range iterates the map.
|
|
func (m *SyncMap[K, V]) Range(visitor func(K, V) bool) {
|
|
m.Map.Range(func(k any, v any) bool {
|
|
return visitor(k.(K), v.(V))
|
|
})
|
|
}
|