Skip to content

Commit 5d00f82

Browse files
committed
map
1 parent 114384e commit 5d00f82

File tree

2 files changed

+109
-0
lines changed

2 files changed

+109
-0
lines changed

maps/maps.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package maps
2+
3+
import "sync"
4+
5+
// Map which support multi-threading
6+
type Map[K comparable, V any] struct {
7+
lock sync.RWMutex
8+
inner map[K]V
9+
}
10+
11+
func NewMap[K comparable, V any](from map[K]V) *Map[K, V] {
12+
m := &Map[K, V]{
13+
lock: sync.RWMutex{},
14+
}
15+
m.Clear()
16+
17+
for k, v := range from {
18+
m.Set(k, v)
19+
}
20+
21+
return m
22+
}
23+
24+
func (m *Map[K, V]) Set(key K, value V) *Map[K, V] {
25+
m.lock.Lock()
26+
defer m.lock.Unlock()
27+
28+
m.inner[key] = value
29+
return m
30+
}
31+
32+
func (m *Map[K, V]) Get(key K) V {
33+
m.lock.RLock()
34+
defer m.lock.RUnlock()
35+
36+
return m.inner[key]
37+
}
38+
39+
// Iterator implementation
40+
func (m *Map[K, V]) All(yield func(K, V) bool) {
41+
m.lock.RLock()
42+
defer m.lock.RUnlock()
43+
44+
for k, v := range m.inner {
45+
if !yield(k, v) {
46+
break
47+
}
48+
}
49+
}
50+
51+
func (m *Map[K, V]) Delete(key K) *Map[K, V] {
52+
m.lock.Lock()
53+
defer m.lock.Unlock()
54+
55+
delete(m.inner, key)
56+
return m
57+
}
58+
59+
func (m *Map[K, V]) First(filter func(K, V) bool) *K {
60+
for k, v := range m.inner {
61+
if filter(k, v) {
62+
return &k
63+
}
64+
}
65+
return nil
66+
}
67+
68+
func (m *Map[K, V]) Clear() *Map[K, V] {
69+
m.lock.Lock()
70+
defer m.lock.Unlock()
71+
72+
m.inner = make(map[K]V)
73+
return m
74+
}

maps/maps_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package maps
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func TestNewMap(t *testing.T) {
9+
10+
tests := []struct {
11+
name string
12+
m *Map[string, string]
13+
want string
14+
}{{
15+
name: "main",
16+
m: NewMap(map[string]string{
17+
"1": "1",
18+
"2": "2",
19+
"3": "3",
20+
}),
21+
want: "2",
22+
}}
23+
for _, tt := range tests {
24+
t.Run(tt.name, func(t *testing.T) {
25+
got := tt.m.First(func(s1, s2 string) bool { return s1 == "2" })
26+
27+
if got == nil {
28+
t.Errorf("NewMap() = <nil>, want %v", tt.want)
29+
}
30+
if !reflect.DeepEqual(*got, tt.want) {
31+
t.Errorf("NewMap() = %v, want %v", got, tt.want)
32+
}
33+
})
34+
}
35+
}

0 commit comments

Comments
 (0)