File tree Expand file tree Collapse file tree 2 files changed +109
-0
lines changed
Expand file tree Collapse file tree 2 files changed +109
-0
lines changed Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 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+ }
You can’t perform that action at this time.
0 commit comments