github.com/m4gshm/gollections@v0.0.10/iter/api.go (about)

     1  // Package iter provides generic constructors and helpers for iterators
     2  package iter
     3  
     4  import (
     5  	"github.com/m4gshm/gollections/c"
     6  	"github.com/m4gshm/gollections/convert/as"
     7  	kvloop "github.com/m4gshm/gollections/kv/loop"
     8  	"github.com/m4gshm/gollections/kv/stream"
     9  	"github.com/m4gshm/gollections/loop"
    10  	"github.com/m4gshm/gollections/op/check/not"
    11  	"github.com/m4gshm/gollections/slice"
    12  )
    13  
    14  // Of instantiates an iterator of predefined elements
    15  func Of[T any](elements ...T) *slice.Iter[T] {
    16  	return slice.NewIter(elements)
    17  }
    18  
    19  // Convert instantiates an iterator that converts elements with a converter and returns them
    20  func Convert[From, To any, I c.Iterator[From]](elements I, converter func(From) To) loop.ConvertIter[From, To] {
    21  	return loop.Convert(elements.Next, converter)
    22  }
    23  
    24  // FilterAndConvert returns a stream that filters source elements and converts them
    25  func FilterAndConvert[From, To any, I c.Iterator[From]](elements I, filter func(From) bool, converter func(From) To) loop.ConvertFiltIter[From, To] {
    26  	return loop.FilterAndConvert(elements.Next, filter, converter)
    27  }
    28  
    29  // Flat instantiates an iterator that converts the collection elements into slices and then flattens them to one level
    30  func Flat[From, To any, I c.Iterator[From]](elements I, flattener func(From) []To) *loop.FlatIter[From, To] {
    31  	return loop.Flat(elements.Next, flattener)
    32  }
    33  
    34  // FilterAndFlat filters source elements and extracts slices of 'To' by the 'flattener' function
    35  func FilterAndFlat[From, To any, I c.Iterator[From]](elements I, filter func(From) bool, flattener func(From) []To) *loop.FlatFilterIter[From, To] {
    36  	return loop.FilterAndFlat(elements.Next, filter, flattener)
    37  }
    38  
    39  // Filter instantiates an iterator that checks elements by a filter and returns successful ones
    40  func Filter[T any, I c.Iterator[T]](elements I, filter func(T) bool) loop.FiltIter[T] {
    41  	return loop.Filter(elements.Next, filter)
    42  }
    43  
    44  // NotNil instantiates an iterator that filters nullable elements
    45  func NotNil[T any, I c.Iterator[*T]](elements I) loop.FiltIter[*T] {
    46  	return Filter(elements, not.Nil[T])
    47  }
    48  
    49  // Reduce reduces elements to an one
    50  func Reduce[T any, I c.Iterator[T]](elements I, by func(T, T) T) T {
    51  	return loop.Reduce(elements.Next, by)
    52  }
    53  
    54  // Group transforms iterable elements to the MapPipe based on applying key extractor to the elements
    55  func Group[T any, K comparable, I c.Iterator[T]](elements I, by func(T) K) stream.Iter[K, T, map[K][]T] {
    56  	return stream.New(loop.KeyValue(elements.Next, by, as.Is[T]).Next, kvloop.Group[K, T])
    57  }
    58  
    59  // First returns the first element that satisfies requirements of the predicate 'filter'
    60  func First[T any, I c.Iterator[T]](elements I, filter func(T) bool) (T, bool) {
    61  	return loop.First(elements.Next, filter)
    62  }
    63  
    64  // KeyValue converts a c.Iterator to a kv.KVIterator using key and value extractors
    65  func KeyValue[T, K, V any, I c.Iterator[T]](elements I, keyExtractor func(T) K, valExtractor func(T) V) loop.KeyValuer[T, K, V] {
    66  	kv := loop.KeyValue(elements.Next, keyExtractor, valExtractor)
    67  	return kv
    68  }