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  }