on main help sign in
feat(csync.Map): added GetOrSet
1e47f4eCarlos Alexandro Becker
internal/csync/maps.go+12
@@ -56,6 +56,18 @@ func (m *Map[K, V]) Len() int {
56 return len(m.inner)
56 return len(m.inner)
57}
57}
58
58
59+// GetOrSet gets and returns the key if it exists, otherwise, it executes the
60+// given function, set its return value for the given key, and returns it.
61+func (m *Map[K, V]) GetOrSet(key K, fn func() V) V {
62+ got, ok := m.Get(key)
63+ if ok {
64+ return got
65+ }
66+ value := fn()
67+ m.Set(key, value)
68+ return value
69+}
70+
59// Take gets an item and then deletes it.
71// Take gets an item and then deletes it.
60func (m *Map[K, V]) Take(key K) (V, bool) {
72func (m *Map[K, V]) Take(key K) (V, bool) {
61 m.mu.Lock()
73 m.mu.Lock()
internal/csync/maps_test.go+10
@@ -54,6 +54,16 @@ func TestMap_Set(t *testing.T) {
54 require.Equal(t, 1, m.Len())
54 require.Equal(t, 1, m.Len())
55}
55}
56
56
57+func TestMap_GetOrSet(t *testing.T) {
58+ t.Parallel()
59+
60+ m := NewMap[string, int]()
61+
62+ require.Equal(t, 42, m.GetOrSet("key1", func() int { return 42 }))
63+ require.Equal(t, 42, m.GetOrSet("key1", func() int { return 99999 }))
64+ require.Equal(t, 1, m.Len())
65+}
66+
57func TestMap_Get(t *testing.T) {
67func TestMap_Get(t *testing.T) {
58 t.Parallel()
68 t.Parallel()
59
69