Skip to content

Commit 6dee8f3

Browse files
committed
Add CollectErr consumer and related helpers
1 parent 2c10c17 commit 6dee8f3

File tree

5 files changed

+47
-1
lines changed

5 files changed

+47
-1
lines changed

it/iter.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package it
22

33
import (
44
"cmp"
5+
"errors"
56
"iter"
67
)
78

@@ -125,3 +126,19 @@ func Find2[V, W any](iterator func(func(V, W) bool), pred func(V, W) bool) (V, W
125126
var zeroW W
126127
return zeroV, zeroW, false
127128
}
129+
130+
// CollectErr consumes an [iter.Seq2] where the right side yields errors and
131+
// returns a slice of values and all errors joined together.
132+
func CollectErr[V any](delegate func(func(V, error) bool)) ([]V, error) {
133+
var (
134+
values []V
135+
errs []error
136+
)
137+
138+
for v, err := range delegate {
139+
values = append(values, v)
140+
errs = append(errs, err)
141+
}
142+
143+
return values, errors.Join(errs...)
144+
}

it/iter_test.go

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package it_test
33
import (
44
"fmt"
55
"slices"
6+
"strings"
67
"testing"
78

89
"github.com/BooleanCat/go-functional/v2/internal/assert"
@@ -126,7 +127,17 @@ func ExampleFind2_notFound() {
126127
index, value, ok := it.Find2(it.Enumerate(slices.Values([]int{1, 2, 3})), func(i, v int) bool {
127128
return i == 4
128129
})
129-
fmt.Println(index, value, ok)
130130

131+
fmt.Println(index, value, ok)
131132
// Output: 0 0 false
132133
}
134+
135+
func ExampleCollectErr() {
136+
data := strings.NewReader("one\ntwo\nthree\n")
137+
lines, err := it.CollectErr(it.LinesString(data))
138+
fmt.Println(err)
139+
fmt.Println(lines)
140+
// Output:
141+
// <nil>
142+
// [one two three]
143+
}

it/itx/iter.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,3 +73,9 @@ func (iterator Iterator[V]) Find(predicate func(V) bool) (V, bool) {
7373
func (iterator Iterator2[V, W]) Find(predicate func(V, W) bool) (V, W, bool) {
7474
return it.Find2(iterator, predicate)
7575
}
76+
77+
// CollectErr consumes an [Iterator2] where the right side yields errors and
78+
// returns a slice of values and all errors yielded joined together.
79+
func CollectErr[V any](iterator Iterator2[V, error]) ([]V, error) {
80+
return it.CollectErr(iter.Seq2[V, error](iterator))
81+
}

it/itx/iter_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"maps"
66
"slices"
7+
"strings"
78

89
"github.com/BooleanCat/go-functional/v2/it/itx"
910
)
@@ -77,3 +78,13 @@ func ExampleFromMap() {
7778
fmt.Println(itx.FromMap(map[int]int{1: 2}).Right().Collect())
7879
// Output: [2]
7980
}
81+
82+
func ExampleCollectErr() {
83+
data := strings.NewReader("one\ntwo\nthree\n")
84+
lines, err := itx.CollectErr(itx.LinesString(data))
85+
fmt.Println(err)
86+
fmt.Println(lines)
87+
// Output:
88+
// <nil>
89+
// [one two three]
90+
}

it/lines_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ func TestLinesYieldsFalseWithError(t *testing.T) {
7070

7171
func ExampleLinesString() {
7272
buffer := strings.NewReader("one\ntwo\nthree\n")
73+
7374
for line, err := range it.LinesString(buffer) {
7475
if err != nil {
7576
fmt.Println(err)

0 commit comments

Comments
 (0)