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 }