@@ -13,16 +13,16 @@ import (
13
13
14
14
// Flatten flattens a nested iterator
15
15
func Flatten [A any , B any ](iterator Iterator [A ], transformer Transformer [A , []B ]) Iterator [B ] {
16
- return & flattened [A , B ]{Iterator : iterator , transformer : transformer , remaining : []B {}}
16
+ return & flattenedPointers [A , B ]{Iterator : iterator , transformer : transformer , remaining : []B {}}
17
17
}
18
18
19
- type flattened [A any , B any ] struct {
19
+ type flattenedPointers [A any , B any ] struct {
20
20
Iterator [A ]
21
21
transformer func (A ) ([]B , error )
22
22
remaining []B
23
23
}
24
24
25
- func (it * flattened [A , B ]) Next () (B , error ) {
25
+ func (it * flattenedPointers [A , B ]) Next () (B , error ) {
26
26
if len (it .remaining ) > 0 {
27
27
n := it .remaining [0 ]
28
28
it .remaining = it .remaining [1 :]
@@ -40,3 +40,31 @@ func (it *flattened[A, B]) Next() (B, error) {
40
40
return next [0 ], nil
41
41
}
42
42
}
43
+ func FlattenValues [A any , B any ](iterator Iterator [A ], transformer Transformer [A , []B ]) Iterator [* B ] {
44
+ return & flattenedValues [A , B ]{Iterator : iterator , transformer : transformer , remaining : []B {}}
45
+ }
46
+
47
+ type flattenedValues [A any , B any ] struct {
48
+ Iterator [A ]
49
+ transformer func (A ) ([]B , error )
50
+ remaining []B
51
+ }
52
+
53
+ func (it * flattenedValues [A , B ]) Next () (* B , error ) {
54
+ if len (it .remaining ) > 0 {
55
+ n := it .remaining [0 ]
56
+ it .remaining = it .remaining [1 :]
57
+ return & n , nil
58
+ } else if next , err := it .Iterator .Next (); err != nil {
59
+ return nil , errors .Wrapf (err , "failed fetching" )
60
+ } else if utils .IsNil (next ) {
61
+ return nil , nil
62
+ } else if next , err := it .transformer (next ); err != nil {
63
+ return nil , errors .Wrapf (err , "failed transforming" )
64
+ } else if len (next ) == 0 {
65
+ return nil , nil
66
+ } else {
67
+ it .remaining = next [1 :]
68
+ return & next [0 ], nil
69
+ }
70
+ }
0 commit comments