@@ -110,6 +110,72 @@ func TestMap_Len(t *testing.T) {
110 assert.Equal(t, 0, m.Len())
110 assert.Equal(t, 0, m.Len())
113+func TestMap_Take(t *testing.T) {
116+ m := NewMap[string, int]()
120+ assert.Equal(t, 2, m.Len())
122+ value, ok := m.Take("key1")
124+ assert.Equal(t, 42, value)
125+ assert.Equal(t, 1, m.Len())
127+ _, exists := m.Get("key1")
128+ assert.False(t, exists)
130+ value, ok = m.Get("key2")
132+ assert.Equal(t, 100, value)
135+func TestMap_Take_NonexistentKey(t *testing.T) {
138+ m := NewMap[string, int]()
141+ value, ok := m.Take("nonexistent")
143+ assert.Equal(t, 0, value)
144+ assert.Equal(t, 1, m.Len())
146+ value, ok = m.Get("key1")
148+ assert.Equal(t, 42, value)
151+func TestMap_Take_EmptyMap(t *testing.T) {
154+ m := NewMap[string, int]()
156+ value, ok := m.Take("key1")
158+ assert.Equal(t, 0, value)
159+ assert.Equal(t, 0, m.Len())
162+func TestMap_Take_SameKeyTwice(t *testing.T) {
165+ m := NewMap[string, int]()
168+ value, ok := m.Take("key1")
170+ assert.Equal(t, 42, value)
171+ assert.Equal(t, 0, m.Len())
173+ value, ok = m.Take("key1")
175+ assert.Equal(t, 0, value)
176+ assert.Equal(t, 0, m.Len())
113func TestMap_Seq2(t *testing.T) {
179func TestMap_Seq2(t *testing.T) {
114 t.Parallel()
180 t.Parallel()
@@ -158,6 +224,57 @@ func TestMap_Seq2_EmptyMap(t *testing.T) {
158 assert.Equal(t, 0, count)
224 assert.Equal(t, 0, count)
227+func TestMap_Seq(t *testing.T) {
230+ m := NewMap[string, int]()
235+ collected := make([]int, 0)
236+ for v := range m.Seq() {
237+ collected = append(collected, v)
240+ assert.Equal(t, 3, len(collected))
241+ assert.Contains(t, collected, 1)
242+ assert.Contains(t, collected, 2)
243+ assert.Contains(t, collected, 3)
246+func TestMap_Seq_EarlyReturn(t *testing.T) {
249+ m := NewMap[string, int]()
262+ assert.Equal(t, 2, count)
265+func TestMap_Seq_EmptyMap(t *testing.T) {
268+ m := NewMap[string, int]()
275+ assert.Equal(t, 0, count)
161func TestMap_MarshalJSON(t *testing.T) {
278func TestMap_MarshalJSON(t *testing.T) {
162 t.Parallel()
279 t.Parallel()
@@ -371,6 +488,82 @@ func TestMap_ConcurrentSeq2(t *testing.T) {
371 wg.Wait()
488 wg.Wait()
491+func TestMap_ConcurrentSeq(t *testing.T) {
494+ m := NewMap[int, int]()
495+ for i := range 100 {
499+ var wg sync.WaitGroup
500+ const numIterators = 10
502+ wg.Add(numIterators)
503+ for range numIterators {
507+ values := make(map[int]bool)
508+ for v := range m.Seq() {
512+ assert.Equal(t, 100, count)
513+ for i := range 100 {
514+ assert.True(t, values[i*2])
522+func TestMap_ConcurrentTake(t *testing.T) {
525+ m := NewMap[int, int]()
526+ const numItems = 1000
528+ for i := range numItems {
532+ var wg sync.WaitGroup
533+ const numWorkers = 10
534+ taken := make([][]int, numWorkers)
537+ for i := range numWorkers {
538+ go func(workerID int) {
540+ taken[workerID] = make([]int, 0)
541+ for j := workerID; j < numItems; j += numWorkers {
542+ if value, ok := m.Take(j); ok {
543+ taken[workerID] = append(taken[workerID], value)
551+ assert.Equal(t, 0, m.Len())
553+ allTaken := make(map[int]bool)
554+ for _, workerTaken := range taken {
555+ for _, value := range workerTaken {
556+ assert.False(t, allTaken[value], "Value %d was taken multiple times", value)
557+ allTaken[value] = true
561+ assert.Equal(t, numItems, len(allTaken))
562+ for i := range numItems {
563+ assert.True(t, allTaken[i*2], "Expected value %d to be taken", i*2)
374func TestMap_TypeSafety(t *testing.T) {
567func TestMap_TypeSafety(t *testing.T) {
375 t.Parallel()
568 t.Parallel()
@@ -431,6 +624,38 @@ func BenchmarkMap_Seq2(b *testing.B) {
627+func BenchmarkMap_Seq(b *testing.B) {
628+ m := NewMap[int, int]()
629+ for i := range 1000 {
639+func BenchmarkMap_Take(b *testing.B) {
640+ m := NewMap[int, int]()
641+ for i := range 1000 {
646+ for i := 0; b.Loop(); i++ {
651+ for j := range 1000 {
434func BenchmarkMap_ConcurrentReadWrite(b *testing.B) {
659func BenchmarkMap_ConcurrentReadWrite(b *testing.B) {
435 m := NewMap[int, int]()
660 m := NewMap[int, int]()
436 for i := range 1000 {
661 for i := range 1000 {