Skip to content

Commit 1d996e3

Browse files
refine ForEachIdxErr
1 parent 43a82a4 commit 1d996e3

File tree

3 files changed

+206
-21
lines changed

3 files changed

+206
-21
lines changed

coverage.txt

+183
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,183 @@
1+
mode: atomic
2+
github.com/sourcegraph/conc/waitgroup.go:10.32,12.2 1 1
3+
github.com/sourcegraph/conc/waitgroup.go:28.34,30.12 2 134
4+
github.com/sourcegraph/conc/waitgroup.go:30.12,33.3 2 134
5+
github.com/sourcegraph/conc/waitgroup.go:38.28,43.2 2 6
6+
github.com/sourcegraph/conc/waitgroup.go:47.56,52.2 2 4
7+
github.com/sourcegraph/conc/iter/iter.go:14.33,14.65 1 36
8+
github.com/sourcegraph/conc/iter/iter.go:42.44,42.79 1 4
9+
github.com/sourcegraph/conc/iter/iter.go:53.56,54.43 1 6
10+
github.com/sourcegraph/conc/iter/iter.go:54.43,56.3 1 10034
11+
github.com/sourcegraph/conc/iter/iter.go:61.52,61.90 1 4
12+
github.com/sourcegraph/conc/iter/iter.go:66.67,68.2 1 7
13+
github.com/sourcegraph/conc/iter/iter.go:72.59,74.2 1 6
14+
github.com/sourcegraph/conc/iter/iter.go:78.64,79.29 1 24
15+
github.com/sourcegraph/conc/iter/iter.go:79.29,82.3 1 20
16+
github.com/sourcegraph/conc/iter/iter.go:84.2,85.35 2 24
17+
github.com/sourcegraph/conc/iter/iter.go:85.35,88.3 1 17
18+
github.com/sourcegraph/conc/iter/iter.go:90.2,92.17 2 24
19+
github.com/sourcegraph/conc/iter/iter.go:92.17,94.47 2 123
20+
github.com/sourcegraph/conc/iter/iter.go:94.47,96.4 1 40079
21+
github.com/sourcegraph/conc/iter/iter.go:99.2,100.42 2 24
22+
github.com/sourcegraph/conc/iter/iter.go:100.42,102.3 1 123
23+
github.com/sourcegraph/conc/iter/iter.go:103.2,103.11 1 24
24+
github.com/sourcegraph/conc/iter/iter.go:109.71,110.59 1 21
25+
github.com/sourcegraph/conc/iter/iter.go:110.59,112.3 1 30076
26+
github.com/sourcegraph/conc/iter/iter.go:118.79,119.29 1 43
27+
github.com/sourcegraph/conc/iter/iter.go:119.29,122.3 1 13
28+
github.com/sourcegraph/conc/iter/iter.go:124.2,125.35 2 43
29+
github.com/sourcegraph/conc/iter/iter.go:125.35,128.3 1 33
30+
github.com/sourcegraph/conc/iter/iter.go:130.2,136.17 5 43
31+
github.com/sourcegraph/conc/iter/iter.go:136.17,138.65 2 4177
32+
github.com/sourcegraph/conc/iter/iter.go:138.65,139.42 1 60157
33+
github.com/sourcegraph/conc/iter/iter.go:139.42,140.76 1 32
34+
github.com/sourcegraph/conc/iter/iter.go:140.76,144.6 3 32
35+
github.com/sourcegraph/conc/iter/iter.go:146.5,146.32 1 32
36+
github.com/sourcegraph/conc/iter/iter.go:151.2,152.60 2 43
37+
github.com/sourcegraph/conc/iter/iter.go:152.60,154.3 1 4177
38+
github.com/sourcegraph/conc/iter/iter.go:155.2,157.29 2 43
39+
github.com/sourcegraph/conc/iter/map.go:19.49,21.2 1 6
40+
github.com/sourcegraph/conc/iter/map.go:26.56,28.53 2 7
41+
github.com/sourcegraph/conc/iter/map.go:28.53,30.3 1 20015
42+
github.com/sourcegraph/conc/iter/map.go:31.2,31.12 1 6
43+
github.com/sourcegraph/conc/iter/map.go:39.70,41.2 1 6
44+
github.com/sourcegraph/conc/iter/map.go:47.77,53.53 2 6
45+
github.com/sourcegraph/conc/iter/map.go:53.53,56.17 3 21
46+
github.com/sourcegraph/conc/iter/map.go:56.17,60.4 3 3
47+
github.com/sourcegraph/conc/iter/map.go:62.2,62.34 1 5
48+
github.com/sourcegraph/conc/panics/panics.go:21.33,24.2 2 113
49+
github.com/sourcegraph/conc/panics/panics.go:26.32,27.34 1 113
50+
github.com/sourcegraph/conc/panics/panics.go:27.34,30.3 2 9
51+
github.com/sourcegraph/conc/panics/panics.go:36.29,37.38 1 2
52+
github.com/sourcegraph/conc/panics/panics.go:37.38,38.13 1 1
53+
github.com/sourcegraph/conc/panics/panics.go:44.42,46.2 1 12
54+
github.com/sourcegraph/conc/panics/panics.go:52.50,61.2 3 9
55+
github.com/sourcegraph/conc/panics/panics.go:77.37,79.2 1 6
56+
github.com/sourcegraph/conc/panics/panics.go:83.37,84.14 1 9
57+
github.com/sourcegraph/conc/panics/panics.go:84.14,86.3 1 1
58+
github.com/sourcegraph/conc/panics/panics.go:87.2,87.26 1 8
59+
github.com/sourcegraph/conc/panics/panics.go:95.39,95.60 1 0
60+
github.com/sourcegraph/conc/panics/panics.go:97.39,98.36 1 5
61+
github.com/sourcegraph/conc/panics/panics.go:98.36,100.3 1 3
62+
github.com/sourcegraph/conc/panics/panics.go:101.2,101.12 1 2
63+
github.com/sourcegraph/conc/panics/try.go:7.31,11.2 3 2
64+
github.com/sourcegraph/conc/pool/context_pool.go:24.61,25.30 1 1456
65+
github.com/sourcegraph/conc/pool/context_pool.go:25.30,26.22 1 1456
66+
github.com/sourcegraph/conc/pool/context_pool.go:26.22,30.17 1 17
67+
github.com/sourcegraph/conc/pool/context_pool.go:30.17,31.33 1 17
68+
github.com/sourcegraph/conc/pool/context_pool.go:31.33,33.14 2 2
69+
github.com/sourcegraph/conc/pool/context_pool.go:38.3,39.36 2 1456
70+
github.com/sourcegraph/conc/pool/context_pool.go:39.36,47.4 3 13
71+
github.com/sourcegraph/conc/pool/context_pool.go:48.3,48.13 1 1441
72+
github.com/sourcegraph/conc/pool/context_pool.go:54.36,58.2 2 32
73+
github.com/sourcegraph/conc/pool/context_pool.go:64.53,68.2 3 4
74+
github.com/sourcegraph/conc/pool/context_pool.go:78.56,82.2 3 7
75+
github.com/sourcegraph/conc/pool/context_pool.go:87.51,92.2 4 2
76+
github.com/sourcegraph/conc/pool/context_pool.go:96.61,100.2 3 8
77+
github.com/sourcegraph/conc/pool/context_pool.go:102.44,104.2 1 31
78+
github.com/sourcegraph/conc/pool/error_pool.go:27.40,28.19 1 3710
79+
github.com/sourcegraph/conc/pool/error_pool.go:28.19,30.3 1 3710
80+
github.com/sourcegraph/conc/pool/error_pool.go:35.34,41.20 4 54
81+
github.com/sourcegraph/conc/pool/error_pool.go:41.20,43.3 1 21
82+
github.com/sourcegraph/conc/pool/error_pool.go:43.8,43.29 1 30
83+
github.com/sourcegraph/conc/pool/error_pool.go:43.29,45.3 1 5
84+
github.com/sourcegraph/conc/pool/error_pool.go:45.8,47.3 1 25
85+
github.com/sourcegraph/conc/pool/error_pool.go:54.67,62.2 3 2
86+
github.com/sourcegraph/conc/pool/error_pool.go:66.49,70.2 3 5
87+
github.com/sourcegraph/conc/pool/error_pool.go:74.57,78.2 3 14
88+
github.com/sourcegraph/conc/pool/error_pool.go:83.39,88.2 1 33
89+
github.com/sourcegraph/conc/pool/error_pool.go:90.42,92.2 1 60
90+
github.com/sourcegraph/conc/pool/error_pool.go:94.39,95.16 1 3720
91+
github.com/sourcegraph/conc/pool/error_pool.go:95.16,99.3 3 45
92+
github.com/sourcegraph/conc/pool/pool.go:11.18,13.2 1 76
93+
github.com/sourcegraph/conc/pool/pool.go:39.29,42.22 2 6291
94+
github.com/sourcegraph/conc/pool/pool.go:42.22,44.10 1 423
95+
github.com/sourcegraph/conc/pool/pool.go:45.21,45.21 0 130
96+
github.com/sourcegraph/conc/pool/pool.go:47.11,50.23 1 293
97+
github.com/sourcegraph/conc/pool/pool.go:50.23,52.5 1 293
98+
github.com/sourcegraph/conc/pool/pool.go:54.8,55.10 1 5868
99+
github.com/sourcegraph/conc/pool/pool.go:56.32,59.23 1 656
100+
github.com/sourcegraph/conc/pool/pool.go:59.23,61.5 1 656
101+
github.com/sourcegraph/conc/pool/pool.go:62.21,64.10 1 5212
102+
github.com/sourcegraph/conc/pool/pool.go:72.23,79.15 3 73
103+
github.com/sourcegraph/conc/pool/pool.go:79.15,79.43 1 73
104+
github.com/sourcegraph/conc/pool/pool.go:81.2,81.17 1 73
105+
github.com/sourcegraph/conc/pool/pool.go:85.36,87.2 1 1
106+
github.com/sourcegraph/conc/pool/pool.go:91.47,93.11 2 25
107+
github.com/sourcegraph/conc/pool/pool.go:93.11,94.62 1 1
108+
github.com/sourcegraph/conc/pool/pool.go:96.2,97.10 2 22
109+
github.com/sourcegraph/conc/pool/pool.go:102.23,103.23 1 6364
110+
github.com/sourcegraph/conc/pool/pool.go:103.23,105.3 1 79
111+
github.com/sourcegraph/conc/pool/pool.go:111.37,112.20 1 291
112+
github.com/sourcegraph/conc/pool/pool.go:112.20,113.78 1 12
113+
github.com/sourcegraph/conc/pool/pool.go:119.40,124.2 2 55
114+
github.com/sourcegraph/conc/pool/pool.go:129.29,134.2 2 88
115+
github.com/sourcegraph/conc/pool/pool.go:140.62,148.2 3 31
116+
github.com/sourcegraph/conc/pool/pool.go:150.43,155.24 2 949
117+
github.com/sourcegraph/conc/pool/pool.go:155.24,157.3 1 949
118+
github.com/sourcegraph/conc/pool/pool.go:159.2,159.25 1 937
119+
github.com/sourcegraph/conc/pool/pool.go:159.25,161.3 1 5342
120+
github.com/sourcegraph/conc/pool/pool.go:166.30,168.2 1 1
121+
github.com/sourcegraph/conc/pool/pool.go:170.28,171.14 1 943
122+
github.com/sourcegraph/conc/pool/pool.go:171.14,173.3 1 656
123+
github.com/sourcegraph/conc/pool/result_context_pool.go:22.71,24.51 2 1132
124+
github.com/sourcegraph/conc/pool/result_context_pool.go:24.51,28.3 3 1132
125+
github.com/sourcegraph/conc/pool/result_context_pool.go:33.52,38.2 4 16
126+
github.com/sourcegraph/conc/pool/result_context_pool.go:43.75,47.2 3 1
127+
github.com/sourcegraph/conc/pool/result_context_pool.go:51.71,55.2 3 1
128+
github.com/sourcegraph/conc/pool/result_context_pool.go:60.74,64.2 3 2
129+
github.com/sourcegraph/conc/pool/result_context_pool.go:69.69,73.2 3 1
130+
github.com/sourcegraph/conc/pool/result_context_pool.go:77.79,81.2 3 5
131+
github.com/sourcegraph/conc/pool/result_context_pool.go:83.53,85.2 1 10
132+
github.com/sourcegraph/conc/pool/result_error_pool.go:24.54,26.30 2 1122
133+
github.com/sourcegraph/conc/pool/result_error_pool.go:26.30,30.3 3 1122
134+
github.com/sourcegraph/conc/pool/result_error_pool.go:35.50,40.2 4 11
135+
github.com/sourcegraph/conc/pool/result_error_pool.go:45.71,49.2 3 1
136+
github.com/sourcegraph/conc/pool/result_error_pool.go:55.85,60.2 2 1
137+
github.com/sourcegraph/conc/pool/result_error_pool.go:64.67,68.2 3 1
138+
github.com/sourcegraph/conc/pool/result_error_pool.go:72.75,76.2 3 5
139+
github.com/sourcegraph/conc/pool/result_error_pool.go:78.51,80.2 1 8
140+
github.com/sourcegraph/conc/pool/result_pool.go:13.45,17.2 1 36
141+
github.com/sourcegraph/conc/pool/result_pool.go:32.40,34.19 2 1324
142+
github.com/sourcegraph/conc/pool/result_pool.go:34.19,36.3 1 1324
143+
github.com/sourcegraph/conc/pool/result_pool.go:41.36,46.2 4 9
144+
github.com/sourcegraph/conc/pool/result_pool.go:49.45,51.2 1 0
145+
github.com/sourcegraph/conc/pool/result_pool.go:55.58,60.2 2 12
146+
github.com/sourcegraph/conc/pool/result_pool.go:66.80,71.2 2 15
147+
github.com/sourcegraph/conc/pool/result_pool.go:75.65,79.2 3 5
148+
github.com/sourcegraph/conc/pool/result_pool.go:81.46,83.2 1 32
149+
github.com/sourcegraph/conc/pool/result_pool.go:96.47,103.2 5 3578
150+
github.com/sourcegraph/conc/pool/result_pool.go:105.64,109.25 3 3577
151+
github.com/sourcegraph/conc/pool/result_pool.go:109.25,113.3 3 130
152+
github.com/sourcegraph/conc/pool/result_pool.go:115.2,117.13 2 3577
153+
github.com/sourcegraph/conc/pool/result_pool.go:117.13,119.3 1 24
154+
github.com/sourcegraph/conc/pool/result_pool.go:123.64,124.21 1 35
155+
github.com/sourcegraph/conc/pool/result_pool.go:124.21,125.73 1 0
156+
github.com/sourcegraph/conc/pool/result_pool.go:128.2,128.43 1 35
157+
github.com/sourcegraph/conc/pool/result_pool.go:128.43,130.3 1 21
158+
github.com/sourcegraph/conc/pool/result_pool.go:132.2,134.30 3 14
159+
github.com/sourcegraph/conc/pool/result_pool.go:134.30,135.13 1 20
160+
github.com/sourcegraph/conc/pool/result_pool.go:135.13,137.4 1 14
161+
github.com/sourcegraph/conc/pool/result_pool.go:137.9,139.4 1 6
162+
github.com/sourcegraph/conc/pool/result_pool.go:141.2,141.17 1 14
163+
github.com/sourcegraph/conc/stream/stream.go:13.20,17.2 1 7
164+
github.com/sourcegraph/conc/stream/stream.go:62.29,72.19 4 169
165+
github.com/sourcegraph/conc/stream/stream.go:72.19,73.16 1 169
166+
github.com/sourcegraph/conc/stream/stream.go:73.16,77.32 1 169
167+
github.com/sourcegraph/conc/stream/stream.go:77.32,78.18 1 1
168+
github.com/sourcegraph/conc/stream/stream.go:78.19,78.20 0 1
169+
github.com/sourcegraph/conc/stream/stream.go:79.5,79.13 1 1
170+
github.com/sourcegraph/conc/stream/stream.go:84.3,85.17 2 169
171+
github.com/sourcegraph/conc/stream/stream.go:91.25,96.15 2 7
172+
github.com/sourcegraph/conc/stream/stream.go:96.15,99.3 2 7
173+
github.com/sourcegraph/conc/stream/stream.go:102.2,102.15 1 7
174+
github.com/sourcegraph/conc/stream/stream.go:105.51,108.2 2 4
175+
github.com/sourcegraph/conc/stream/stream.go:110.25,111.23 1 176
176+
github.com/sourcegraph/conc/stream/stream.go:111.23,116.3 2 7
177+
github.com/sourcegraph/conc/stream/stream.go:121.31,126.34 3 7
178+
github.com/sourcegraph/conc/stream/stream.go:126.34,131.22 2 169
179+
github.com/sourcegraph/conc/stream/stream.go:131.22,133.4 1 164
180+
github.com/sourcegraph/conc/stream/stream.go:136.3,136.20 1 169
181+
github.com/sourcegraph/conc/stream/stream.go:143.18,145.3 1 47
182+
github.com/sourcegraph/conc/stream/stream.go:148.25,150.2 1 169
183+
github.com/sourcegraph/conc/stream/stream.go:152.27,154.2 1 169

iter/iter.go

+8-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
package iter
22

33
import (
4+
"errors"
45
"runtime"
56
"sync"
67
"sync/atomic"
78

89
"github.com/sourcegraph/conc"
9-
"github.com/sourcegraph/conc/internal/multierror"
1010
)
1111

1212
// defaultMaxGoroutines returns the default maximum number of
@@ -127,7 +127,7 @@ func (iter Iterator[T]) ForEachIdxErr(input []T, f func(int, *T) error) error {
127127
iter.MaxGoroutines = numInput
128128
}
129129

130-
var errs error
130+
var errs []error
131131
var errsMu sync.Mutex
132132
var idx atomic.Int64
133133
var failed atomic.Bool
@@ -137,9 +137,11 @@ func (iter Iterator[T]) ForEachIdxErr(input []T, f func(int, *T) error) error {
137137
i := int(idx.Add(1) - 1)
138138
for ; i < numInput && !failed.Load(); i = int(idx.Add(1) - 1) {
139139
if err := f(i, &input[i]); err != nil {
140-
errsMu.Lock()
141-
errs = multierror.Join(errs, err)
142-
errsMu.Unlock()
140+
if alreadyFailedFast := failed.Swap(iter.FailFast); !alreadyFailedFast {
141+
errsMu.Lock()
142+
errs = append(errs, err)
143+
errsMu.Unlock()
144+
}
143145

144146
failed.Store(iter.FailFast)
145147
}
@@ -152,5 +154,5 @@ func (iter Iterator[T]) ForEachIdxErr(input []T, f func(int, *T) error) error {
152154
}
153155
wg.Wait()
154156

155-
return errs
157+
return errors.Join(errs...)
156158
}

iter/iter_test.go

+15-15
Original file line numberDiff line numberDiff line change
@@ -174,13 +174,13 @@ func TestForIterator_EachIdxErr(t *testing.T) {
174174
t.Parallel()
175175

176176
t.Run("failFast=false", func(t *testing.T) {
177-
it := Iterator[int]{MaxGoroutines: 999}
177+
it := iter.Iterator[int]{MaxGoroutines: 999}
178178
forEach := noIndex(it.ForEachIdxErr)
179179
testForEachErr(t, false, forEach)
180180
})
181181

182182
t.Run("failFast=true", func(t *testing.T) {
183-
it := Iterator[int]{MaxGoroutines: 999}
183+
it := iter.Iterator[int]{MaxGoroutines: 999}
184184
forEach := noIndex(it.ForEachIdxErr)
185185
testForEachErr(t, true, forEach)
186186
})
@@ -190,7 +190,7 @@ func TestForIterator_EachIdxErr(t *testing.T) {
190190

191191
input := []int{1, 2, 3, 4, 5}
192192
errTest := errors.New("test error")
193-
iterator := Iterator[int]{MaxGoroutines: 1, FailFast: true}
193+
iterator := iter.Iterator[int]{MaxGoroutines: 1, FailFast: true}
194194

195195
var mu sync.Mutex
196196
var results []int
@@ -211,7 +211,7 @@ func TestForIterator_EachIdxErr(t *testing.T) {
211211
t.Run("safe for reuse", func(t *testing.T) {
212212
t.Parallel()
213213

214-
iterator := Iterator[int]{MaxGoroutines: 999}
214+
iterator := iter.Iterator[int]{MaxGoroutines: 999}
215215

216216
// iter.Concurrency > numInput case that updates iter.Concurrency
217217
_ = iterator.ForEachIdxErr([]int{1, 2, 3}, func(i int, t *int) error {
@@ -224,12 +224,12 @@ func TestForIterator_EachIdxErr(t *testing.T) {
224224
t.Run("allows more than defaultMaxGoroutines() concurrent tasks", func(t *testing.T) {
225225
t.Parallel()
226226

227-
wantConcurrency := 2 * defaultMaxGoroutines()
227+
wantConcurrency := 2 * iter.DefaultMaxGoroutines()
228228

229229
maxConcurrencyHit := make(chan struct{})
230230

231231
tasks := make([]int, wantConcurrency)
232-
iterator := Iterator[int]{MaxGoroutines: wantConcurrency}
232+
iterator := iter.Iterator[int]{MaxGoroutines: wantConcurrency}
233233

234234
var concurrentTasks atomic.Int64
235235
_ = iterator.ForEachIdxErr(tasks, func(_ int, t *int) error {
@@ -257,19 +257,19 @@ func TestForIterator_EachErr(t *testing.T) {
257257
t.Parallel()
258258

259259
t.Run("failFast=false", func(t *testing.T) {
260-
it := Iterator[int]{MaxGoroutines: 999}
260+
it := iter.Iterator[int]{MaxGoroutines: 999}
261261
testForEachErr(t, false, it.ForEachErr)
262262
})
263263

264264
t.Run("failFast=true", func(t *testing.T) {
265-
it := Iterator[int]{MaxGoroutines: 999}
265+
it := iter.Iterator[int]{MaxGoroutines: 999}
266266
testForEachErr(t, true, it.ForEachErr)
267267
})
268268

269269
t.Run("safe for reuse", func(t *testing.T) {
270270
t.Parallel()
271271

272-
iterator := Iterator[int]{MaxGoroutines: 999}
272+
iterator := iter.Iterator[int]{MaxGoroutines: 999}
273273

274274
// iter.Concurrency > numInput case that updates iter.Concurrency
275275
_ = iterator.ForEachErr([]int{1, 2, 3}, func(t *int) error {
@@ -284,7 +284,7 @@ func TestForIterator_EachErr(t *testing.T) {
284284

285285
input := []int{1, 2, 3, 4, 5}
286286
errTest := errors.New("test error")
287-
iterator := Iterator[int]{MaxGoroutines: 1, FailFast: true}
287+
iterator := iter.Iterator[int]{MaxGoroutines: 1, FailFast: true}
288288

289289
var mu sync.Mutex
290290
var results []int
@@ -305,12 +305,12 @@ func TestForIterator_EachErr(t *testing.T) {
305305
t.Run("allows more than defaultMaxGoroutines() concurrent tasks", func(t *testing.T) {
306306
t.Parallel()
307307

308-
wantConcurrency := 2 * defaultMaxGoroutines()
308+
wantConcurrency := 2 * iter.DefaultMaxGoroutines()
309309

310310
maxConcurrencyHit := make(chan struct{})
311311

312312
tasks := make([]int, wantConcurrency)
313-
iterator := Iterator[int]{MaxGoroutines: wantConcurrency}
313+
iterator := iter.Iterator[int]{MaxGoroutines: wantConcurrency}
314314

315315
var concurrentTasks atomic.Int64
316316
_ = iterator.ForEachErr(tasks, func(t *int) error {
@@ -338,7 +338,7 @@ func TestForEachIdxErr(t *testing.T) {
338338
t.Parallel()
339339

340340
t.Run("standart", func(t *testing.T) {
341-
forEach := noIndex(ForEachIdxErr[int])
341+
forEach := noIndex(iter.ForEachIdxErr[int])
342342
testForEachErr(t, false, forEach)
343343
})
344344

@@ -347,7 +347,7 @@ func TestForEachIdxErr(t *testing.T) {
347347
got := []int{}
348348
gotMu := sync.Mutex{}
349349

350-
err := ForEachIdxErr(ints, func(i int, _ *int) error {
350+
err := iter.ForEachIdxErr(ints, func(i int, _ *int) error {
351351
gotMu.Lock()
352352
defer gotMu.Unlock()
353353
got = append(got, i)
@@ -362,7 +362,7 @@ func TestForEachIdxErr(t *testing.T) {
362362
func TestForEachErr(t *testing.T) {
363363
t.Parallel()
364364

365-
testForEachErr(t, false, ForEachErr[int])
365+
testForEachErr(t, false, iter.ForEachErr[int])
366366
}
367367

368368
// noIndex converts a ForEachIdxErr function (or method) into a ForEachErr function (or method).

0 commit comments

Comments
 (0)