diff --git a/pkg/maps/generic.go b/pkg/maps/generic.go new file mode 100644 index 0000000..7d67b95 --- /dev/null +++ b/pkg/maps/generic.go @@ -0,0 +1,57 @@ +package maps + +import "sync" + +type GenericMap[K comparable, V any] struct { + m sync.Map +} + +func (gm *GenericMap[K, V]) Store(key K, value V) { + gm.m.Store(key, value) +} + +func (gm *GenericMap[K, V]) Load(key K) (V, bool) { + value, ok := gm.m.Load(key) + if !ok { + var zero V + return zero, false + } + return value.(V), true +} + +func (gm *GenericMap[K, V]) Delete(key K) { + gm.m.Delete(key) +} + +func (gm *GenericMap[K, V]) Range(f func(key K, value V) bool) { + gm.m.Range(func(key, value any) bool { + return f(key.(K), value.(V)) + }) +} + +func (gm *GenericMap[K, V]) Swap(key K, value V) (previous V, loaded bool) { + actual, swapped := gm.m.Swap(key, value) + return actual.(V), swapped +} + +func (gm *GenericMap[K, V]) LoadOrStore(key K, value V) (V, bool) { + actual, loaded := gm.m.LoadOrStore(key, value) + return actual.(V), loaded +} + +func (gm *GenericMap[K, V]) LoadAndDelete(key K) (value V, loaded bool) { + actual, loaded := gm.m.LoadAndDelete(key) + return actual.(V), loaded +} + +func (gm *GenericMap[K, V]) CompareAndSwap(key K, old V, new V) (swapped bool) { + return gm.m.CompareAndSwap(key, old, new) +} + +func (gm *GenericMap[K, V]) CompareAndDelete(key K, old V) (deleted bool) { + return gm.m.CompareAndDelete(key, old) +} + +func New[K comparable, V any]() *GenericMap[K, V] { + return &GenericMap[K, V]{m: sync.Map{}} +}