github.com/storacha/go-ucanto@v0.7.2/core/iterable/iterable.go (about) 1 package iterable 2 3 import ( 4 "iter" 5 ) 6 7 // TODO: remove when https://github.com/golang/go/issues/61898 lands 8 9 // Map returns an iterator over f applied to seq. 10 func Map[In, Out any](f func(In) Out, seq iter.Seq[In]) iter.Seq[Out] { 11 return func(yield func(Out) bool) { 12 for in := range seq { 13 if !yield(f(in)) { 14 return 15 } 16 } 17 } 18 } 19 20 // Map2 returns an iterator over f applied to seq. 21 func Map2[KIn, VIn, KOut, VOut any](f func(KIn, VIn) (KOut, VOut), seq iter.Seq2[KIn, VIn]) iter.Seq2[KOut, VOut] { 22 return func(yield func(KOut, VOut) bool) { 23 for k, v := range seq { 24 if !yield(f(k, v)) { 25 return 26 } 27 } 28 } 29 } 30 31 // Concat returns an iterator over the concatenation of the sequences. 32 func Concat[V any](seqs ...iter.Seq[V]) iter.Seq[V] { 33 return func(yield func(V) bool) { 34 for _, seq := range seqs { 35 for e := range seq { 36 if !yield(e) { 37 return 38 } 39 } 40 } 41 } 42 } 43 44 // Concat2 returns an iterator over the concatenation of the sequences. 45 func Concat2[K, V any](seqs ...iter.Seq2[K, V]) iter.Seq2[K, V] { 46 return func(yield func(K, V) bool) { 47 for _, seq := range seqs { 48 for k, v := range seq { 49 if !yield(k, v) { 50 return 51 } 52 } 53 } 54 } 55 }