Skip to content

Commit 83493d0

Browse files
authored
Feat/xmap to xsync.SyncMap (#11)
* from normal map to xsync map * find xmap * verify doc
1 parent ac0750d commit 83493d0

3 files changed

Lines changed: 169 additions & 5 deletions

File tree

pkg/xmap/README.md

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,15 @@ import "github.com/dashjay/xiter/pkg/xmap"
1414
- [func Equal\[M1, M2 \~map\[K\]V, K, V comparable\]\(m1 M1, m2 M2\) bool](<#Equal>)
1515
- [func EqualFunc\[M1 \~map\[K\]V1, M2 \~map\[K\]V2, K comparable, V1, V2 any\]\(m1 M1, m2 M2, eq func\(V1, V2\) bool\) bool](<#EqualFunc>)
1616
- [func Filter\[M \~map\[K\]V, K comparable, V any\]\(in M, fn func\(K, V\) bool\) M](<#Filter>)
17+
- [func Find\[K comparable, V any\]\(in map\[K\]V, fn func\(K, V\) bool\) \(K, V, bool\)](<#Find>)
18+
- [func FindKey\[K comparable, V any\]\(in map\[K\]V, target K\) \(K, V, bool\)](<#FindKey>)
19+
- [func FindKeyO\[K comparable, V any\]\(in map\[K\]V, target K\) optional.O\[union.U2\[K, V\]\]](<#FindKeyO>)
20+
- [func FindO\[K comparable, V any\]\(in map\[K\]V, fn func\(K, V\) bool\) optional.O\[union.U2\[K, V\]\]](<#FindO>)
1721
- [func Keys\[M \~map\[K\]V, K comparable, V any\]\(m M\) \[\]K](<#Keys>)
1822
- [func MapKeys\[K comparable, V1 any\]\(in map\[K\]V1, fn func\(K, V1\) K\) map\[K\]V1](<#MapKeys>)
1923
- [func MapValues\[K comparable, V1, V2 any\]\(in map\[K\]V1, fn func\(K, V1\) V2\) map\[K\]V2](<#MapValues>)
2024
- [func ToUnionSlice\[M \~map\[K\]V, K comparable, V any\]\(m M\) \[\]union.U2\[K, V\]](<#ToUnionSlice>)
25+
- [func ToXSyncMap\[K comparable, V any\]\(in map\[K\]V\) \*xsync.SyncMap\[K, V\]](<#ToXSyncMap>)
2126
- [func Values\[M \~map\[K\]V, K comparable, V any\]\(m M\) \[\]V](<#Values>)
2227

2328

@@ -31,7 +36,7 @@ func Clone[M ~map[K]V, K comparable, V any](m M) M
3136

3237

3338
<a name="CoalesceMaps"></a>
34-
## func [CoalesceMaps](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap_common.go#L31>)
39+
## func [CoalesceMaps](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap_common.go#L34>)
3540

3641
```go
3742
func CoalesceMaps[M ~map[K]V, K comparable, V any](maps ...M) M
@@ -93,7 +98,7 @@ func EqualFunc[M1 ~map[K]V1, M2 ~map[K]V2, K comparable, V1, V2 any](m1 M1, m2 M
9398

9499

95100
<a name="Filter"></a>
96-
## func [Filter](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap_common.go#L48>)
101+
## func [Filter](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap_common.go#L51>)
97102

98103
```go
99104
func Filter[M ~map[K]V, K comparable, V any](in M, fn func(K, V) bool) M
@@ -110,6 +115,42 @@ result := Filter(m, fn)
110115
// result will be map[string]int{"b": 2, "c": 3}
111116
```
112117

118+
<a name="Find"></a>
119+
## func [Find](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap_common.go#L137>)
120+
121+
```go
122+
func Find[K comparable, V any](in map[K]V, fn func(K, V) bool) (K, V, bool)
123+
```
124+
125+
126+
127+
<a name="FindKey"></a>
128+
## func [FindKey](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap_common.go#L120>)
129+
130+
```go
131+
func FindKey[K comparable, V any](in map[K]V, target K) (K, V, bool)
132+
```
133+
134+
135+
136+
<a name="FindKeyO"></a>
137+
## func [FindKeyO](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap_common.go#L129>)
138+
139+
```go
140+
func FindKeyO[K comparable, V any](in map[K]V, target K) optional.O[union.U2[K, V]]
141+
```
142+
143+
144+
145+
<a name="FindO"></a>
146+
## func [FindO](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap_common.go#L148>)
147+
148+
```go
149+
func FindO[K comparable, V any](in map[K]V, fn func(K, V) bool) optional.O[union.U2[K, V]]
150+
```
151+
152+
153+
113154
<a name="Keys"></a>
114155
## func [Keys](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap.go#L29>)
115156

@@ -120,7 +161,7 @@ func Keys[M ~map[K]V, K comparable, V any](m M) []K
120161

121162

122163
<a name="MapKeys"></a>
123-
## func [MapKeys](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap_common.go#L96>)
164+
## func [MapKeys](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap_common.go#L99>)
124165

125166
```go
126167
func MapKeys[K comparable, V1 any](in map[K]V1, fn func(K, V1) K) map[K]V1
@@ -153,7 +194,7 @@ result := MapKeys(m, fn)
153194
```
154195

155196
<a name="MapValues"></a>
156-
## func [MapValues](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap_common.go#L72>)
197+
## func [MapValues](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap_common.go#L75>)
157198

158199
```go
159200
func MapValues[K comparable, V1, V2 any](in map[K]V1, fn func(K, V1) V2) map[K]V2
@@ -194,6 +235,27 @@ func ToUnionSlice[M ~map[K]V, K comparable, V any](m M) []union.U2[K, V]
194235

195236

196237

238+
<a name="ToXSyncMap"></a>
239+
## func [ToXSyncMap](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap_common.go#L112>)
240+
241+
```go
242+
func ToXSyncMap[K comparable, V any](in map[K]V) *xsync.SyncMap[K, V]
243+
```
244+
245+
ToXSyncMap converts a map to a xsync.SyncMap.
246+
247+
Parameters:
248+
249+
```
250+
in map[K]V: The input map to convert
251+
```
252+
253+
Returns:
254+
255+
```
256+
*xsync.SyncMap[K, V]: A new xsync.SyncMap containing the same key-value pairs as the input map
257+
```
258+
197259
<a name="Values"></a>
198260
## func [Values](<https://github.com/dashjay/xiter/blob/main/pkg/xmap/xmap.go#L33>)
199261

pkg/xmap/xmap_common.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package xmap
22

33
import (
4+
"github.com/dashjay/xiter/pkg/optional"
5+
"github.com/dashjay/xiter/pkg/union"
46
"github.com/dashjay/xiter/pkg/xiter"
7+
"github.com/dashjay/xiter/pkg/xsync"
58
)
69

710
// CoalesceMaps combines multiple maps into a single map. When duplicate keys are encountered,
@@ -96,3 +99,57 @@ func MapValues[K comparable, V1, V2 any](in map[K]V1, fn func(K, V1) V2) map[K]V
9699
func MapKeys[K comparable, V1 any](in map[K]V1, fn func(K, V1) K) map[K]V1 {
97100
return xiter.ToMap(xiter.Map2(func(k K, v V1) (K, V1) { return fn(k, v), v }, xiter.FromMapKeyAndValues(in)))
98101
}
102+
103+
// ToXSyncMap converts a map to a xsync.SyncMap.
104+
//
105+
// Parameters:
106+
//
107+
// in map[K]V: The input map to convert
108+
//
109+
// Returns:
110+
//
111+
// *xsync.SyncMap[K, V]: A new xsync.SyncMap containing the same key-value pairs as the input map
112+
func ToXSyncMap[K comparable, V any](in map[K]V) *xsync.SyncMap[K, V] {
113+
m := xsync.NewSyncMap[K, V]()
114+
for k, v := range in {
115+
m.Store(k, v)
116+
}
117+
return m
118+
}
119+
120+
func FindKey[K comparable, V any](in map[K]V, target K) (K, V, bool) {
121+
v, ok := in[target]
122+
if ok {
123+
return target, v, ok
124+
}
125+
var zero K
126+
return zero, v, ok
127+
}
128+
129+
func FindKeyO[K comparable, V any](in map[K]V, target K) optional.O[union.U2[K, V]] {
130+
v, ok := in[target]
131+
if ok {
132+
return optional.FromValue(union.U2[K, V]{T1: target, T2: v})
133+
}
134+
return optional.Empty[union.U2[K, V]]()
135+
}
136+
137+
func Find[K comparable, V any](in map[K]V, fn func(K, V) bool) (K, V, bool) {
138+
for k, v := range in {
139+
if fn(k, v) {
140+
return k, v, true
141+
}
142+
}
143+
var k K
144+
var v V
145+
return k, v, false
146+
}
147+
148+
func FindO[K comparable, V any](in map[K]V, fn func(K, V) bool) optional.O[union.U2[K, V]] {
149+
for k, v := range in {
150+
if fn(k, v) {
151+
return optional.FromValue(union.U2[K, V]{T1: k, T2: v})
152+
}
153+
}
154+
return optional.Empty[union.U2[K, V]]()
155+
}

pkg/xmap/xmap_test.go

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,52 @@ func TestMap(t *testing.T) {
132132
emptyMap := map[string]int{}
133133
emptyResult := xmap.MapKeys(emptyMap, fn)
134134
assert.Equal(t, map[string]int{}, emptyResult)
135-
136135
})
137136

137+
t.Run("to xsync-map", func(t *testing.T) {
138+
m := xmap.ToXSyncMap(_map(0, 100))
139+
assert.Equal(t, 100, m.Len())
140+
})
141+
142+
t.Run("xmap find", func(t *testing.T) {
143+
k, _, ok := xmap.Find(_map(0, 100), func(k int, v string) bool {
144+
return k == 50
145+
})
146+
assert.Equal(t, 50, k)
147+
assert.True(t, ok)
148+
149+
res := xmap.FindO(_map(0, 100), func(k int, v string) bool {
150+
return k == 50
151+
})
152+
assert.Equal(t, 50, res.Must().T1)
153+
assert.True(t, res.Ok())
154+
155+
k, _, ok = xmap.FindKey(_map(0, 100), 50)
156+
assert.Equal(t, 50, k)
157+
assert.True(t, ok)
158+
159+
res = xmap.FindKeyO(_map(0, 100), 50)
160+
assert.Equal(t, 50, res.Must().T1)
161+
assert.True(t, res.Ok())
162+
163+
// can not find
164+
k, _, ok = xmap.Find(_map(0, 100), func(k int, v string) bool {
165+
return k == 100
166+
})
167+
assert.Equal(t, 0, k)
168+
assert.False(t, ok)
169+
170+
res = xmap.FindO(_map(0, 100), func(k int, v string) bool {
171+
return k == 100
172+
})
173+
assert.False(t, res.Ok())
174+
175+
k, _, ok = xmap.FindKey(_map(0, 100), 100)
176+
assert.Equal(t, 0, k)
177+
assert.False(t, ok)
178+
179+
res = xmap.FindKeyO(_map(0, 100), 100)
180+
assert.False(t, res.Ok())
181+
182+
})
138183
}

0 commit comments

Comments
 (0)