github.com/m4gshm/gollections@v0.0.10/break/loop/filter.go (about) 1 package loop 2 3 import ( 4 "github.com/m4gshm/gollections/break/c" 5 ) 6 7 // FiltIter is the Iterator wrapper that provides filtering of elements by a Predicate. 8 type FiltIter[T any] struct { 9 next func() (T, bool, error) 10 filter func(T) (bool, error) 11 } 12 13 var ( 14 _ c.Iterator[any] = (*FiltIter[any])(nil) 15 _ c.Iterator[any] = FiltIter[any]{} 16 ) 17 18 var _ c.IterFor[any, FiltIter[any]] = (*FiltIter[any])(nil) 19 20 // For takes elements retrieved by the iterator. Can be interrupt by returning ErrBreak 21 func (f FiltIter[T]) For(walker func(element T) error) error { 22 return For(f.Next, walker) 23 } 24 25 // Next returns the next element. 26 // The ok result indicates whether the element was returned by the iterator. 27 // If ok == false, then the iteration must be completed. 28 func (f FiltIter[T]) Next() (element T, ok bool, err error) { 29 if next, by := f.next, f.filter; next != nil && by != nil { 30 element, ok, err = nextFiltered(next, by) 31 } 32 return element, ok, err 33 } 34 35 // Start is used with for loop construct like 'for i, val, ok, err := i.Start(); ok || err != nil ; val, ok, err = i.Next() { if err != nil { return err }}' 36 func (f FiltIter[T]) Start() (FiltIter[T], T, bool, error) { 37 return startIt[T](f) 38 } 39 40 func nextFiltered[T any](next func() (T, bool, error), filter func(T) (bool, error)) (v T, ok bool, err error) { 41 return Firstt(next, filter) 42 }