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  }