Skip to content

Commit fa73704

Browse files
committed
Support Stringer for remaining iters
1 parent 00822e0 commit fa73704

File tree

6 files changed

+85
-5
lines changed

6 files changed

+85
-5
lines changed

iter/runes.go

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
package iter
22

3-
import "github.com/BooleanCat/go-functional/option"
3+
import (
4+
"fmt"
5+
6+
"github.com/BooleanCat/go-functional/option"
7+
)
48

59
// RunesIter iterator, see [Runes].
610
type RunesIter struct {
@@ -20,7 +24,15 @@ func (iter *RunesIter) Next() option.Option[rune] {
2024
return option.Some(iter.runes[iter.index-1])
2125
}
2226

23-
var _ Iterator[rune] = new(RunesIter)
27+
// String implements the [fmt.Stringer] interface
28+
func (iter RunesIter) String() string {
29+
return "Iterator<Runes>"
30+
}
31+
32+
var (
33+
_ fmt.Stringer = new(RunesIter)
34+
_ Iterator[rune] = new(RunesIter)
35+
)
2436

2537
// Runes instantiates a [*RunesIter] that will yield a rune on iteration.
2638
func Runes[T string | []rune](runes T) *RunesIter {

iter/runes_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,11 @@ func ExampleRunes_slice() {
2222
// Output: 世界
2323
}
2424

25+
func ExampleRunesIter_String() {
26+
fmt.Println(iter.Runes("Hello, 世界!"))
27+
// Output: Iterator<Runes>
28+
}
29+
2530
func TestRunes(t *testing.T) {
2631
runes := iter.Runes("Hello, 世界!").Collect()
2732
assert.SliceEqual[rune](t, runes, []rune{'H', 'e', 'l', 'l', 'o', ',', ' ', '世', '界', '!'})
@@ -41,3 +46,9 @@ func TestRunesEmptySlice(t *testing.T) {
4146
runes := iter.Runes([]rune{}).Collect()
4247
assert.Empty[rune](t, runes)
4348
}
49+
50+
func TestRunesIter_String(t *testing.T) {
51+
runes := iter.Runes("Hello, 世界!")
52+
assert.Equal(t, fmt.Sprintf("%s", runes), "Iterator<Runes>") //nolint:gosimple
53+
assert.Equal(t, fmt.Sprintf("%s", *runes), "Iterator<Runes>") //nolint:gosimple
54+
}

iter/take.go

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
package iter
22

3-
import "github.com/BooleanCat/go-functional/option"
3+
import (
4+
"fmt"
5+
"reflect"
6+
7+
"github.com/BooleanCat/go-functional/option"
8+
)
49

510
// TakeIter iterator, see [Take].
611
type TakeIter[T any] struct {
@@ -33,4 +38,13 @@ func (iter *TakeIter[T]) Next() option.Option[T] {
3338
return next
3439
}
3540

36-
var _ Iterator[struct{}] = new(TakeIter[struct{}])
41+
// String implements the [fmt.Stringer] interface
42+
func (iter TakeIter[T]) String() string {
43+
var instanceOfT T
44+
return fmt.Sprintf("Iterator<Take, type=%s>", reflect.TypeOf(instanceOfT))
45+
}
46+
47+
var (
48+
_ Iterator[int] = new(TakeIter[int])
49+
_ Iterator[struct{}] = new(TakeIter[struct{}])
50+
)

iter/take_test.go

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ func ExampleTake_method() {
3131
// None
3232
}
3333

34+
func ExampleTakeIter_String() {
35+
fmt.Println(iter.Take[int](iter.Count(), 2))
36+
// Output: Iterator<Take, type=int>
37+
}
38+
3439
func TestTakeIter(t *testing.T) {
3540
iter := iter.Take[int](iter.Count(), 2)
3641
assert.Equal(t, iter.Next().Unwrap(), 0)
@@ -51,3 +56,9 @@ func TestTakeExhausted(t *testing.T) {
5156
assert.True(t, iter.Next().IsNone())
5257
assert.Equal(t, delegate.NextCallCount(), 1)
5358
}
59+
60+
func TestTakeString(t *testing.T) {
61+
numbers := iter.Take[int](iter.Count(), 2)
62+
assert.Equal(t, fmt.Sprintf("%s", numbers), "Iterator<Take, type=int>") //nolint:gosimple
63+
assert.Equal(t, fmt.Sprintf("%s", *numbers), "Iterator<Take, type=int>") //nolint:gosimple
64+
}

iter/zip.go

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package iter
22

33
import (
44
"fmt"
5+
"reflect"
56

67
"github.com/BooleanCat/go-functional/option"
78
)
@@ -61,4 +62,17 @@ func (iter *ZipIter[T, U]) Next() option.Option[Pair[T, U]] {
6162
return option.Some(Pair[T, U]{v1, v2})
6263
}
6364

64-
var _ Iterator[Pair[struct{}, struct{}]] = new(ZipIter[struct{}, struct{}])
65+
// String implements the [fmt.Stringer] interface
66+
func (iter ZipIter[T, U]) String() string {
67+
var (
68+
instanceOfT T
69+
instanceOfU U
70+
)
71+
72+
return fmt.Sprintf("Iterator<Zip, type=Pair<%s, %s>>", reflect.TypeOf(instanceOfT), reflect.TypeOf(instanceOfU))
73+
}
74+
75+
var (
76+
_ fmt.Stringer = new(ZipIter[int, int])
77+
_ Iterator[Pair[struct{}, struct{}]] = new(ZipIter[struct{}, struct{}])
78+
)

iter/zip_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ func ExampleZip() {
1818
// Output:[(0, 1) (2, 3) (4, 5)]
1919
}
2020

21+
func ExampleZipIter_String() {
22+
evens := iter.Filter[int](iter.Count(), filters.IsEven[int])
23+
odds := iter.Filter[int](iter.Count(), filters.IsOdd[int])
24+
25+
fmt.Println(iter.Zip[int, int](evens, odds))
26+
// Output: Iterator<Zip, type=Pair<int, int>>
27+
}
28+
2129
func TestPairStringer(t *testing.T) {
2230
foo := map[string]interface{}{
2331
"text": "Random Text",
@@ -74,3 +82,13 @@ func TestZipSecondExhaustedDelegate(t *testing.T) {
7482
assert.True(t, zipped.Next().IsNone())
7583
assert.Equal(t, delegate.NextCallCount(), 1)
7684
}
85+
86+
func TestZipString(t *testing.T) {
87+
evens := iter.Filter[int](iter.Count(), filters.IsEven[int])
88+
odds := iter.Filter[int](iter.Count(), filters.IsOdd[int])
89+
zipped := iter.Zip[int, int](evens, odds)
90+
expected := "Iterator<Zip, type=Pair<int, int>>"
91+
92+
assert.Equal(t, fmt.Sprintf("%s", zipped), expected) //nolint:gosimple
93+
assert.Equal(t, fmt.Sprintf("%s", *zipped), expected) //nolint:gosimple
94+
}

0 commit comments

Comments
 (0)