github.com/m4gshm/gollections@v0.0.10/collection/mutable/ordered/set_iter.go (about)

     1  package ordered
     2  
     3  import (
     4  	"github.com/m4gshm/gollections/c"
     5  	"github.com/m4gshm/gollections/loop"
     6  	"github.com/m4gshm/gollections/slice"
     7  )
     8  
     9  // NewSetIter creates a set's iterator.
    10  func NewSetIter[T any](elements *[]T, del func(v T)) SetIter[T] {
    11  	return SetIter[T]{elements: elements, current: slice.IterNoStarted, del: del}
    12  }
    13  
    14  // SetIter set iterator
    15  type SetIter[T any] struct {
    16  	elements *[]T
    17  	current  int
    18  	del      func(v T)
    19  }
    20  
    21  var (
    22  	_ c.Iterator[any]    = (*SetIter[any])(nil)
    23  	_ c.DelIterator[any] = (*SetIter[any])(nil)
    24  )
    25  
    26  var _ c.IterFor[int, *SetIter[int]] = (*SetIter[int])(nil)
    27  
    28  // For takes elements retrieved by the iterator. Can be interrupt by returning ErrBreak
    29  func (i *SetIter[T]) For(walker func(element T) error) error {
    30  	return loop.For(i.Next, walker)
    31  }
    32  
    33  // ForEach takes all elements retrieved by the iterator.
    34  func (i *SetIter[T]) ForEach(walker func(element T)) {
    35  	loop.ForEach(i.Next, walker)
    36  }
    37  
    38  // Next returns the next element.
    39  // The ok result indicates whether the element was returned by the iterator.
    40  // If ok == false, then the iteration must be completed.
    41  func (i *SetIter[T]) Next() (t T, ok bool) {
    42  	if !(i == nil || i.elements == nil) {
    43  		if slice.HasNext(*i.elements, i.current) {
    44  			i.current++
    45  			return slice.Gett(*i.elements, i.current)
    46  		}
    47  	}
    48  	return t, ok
    49  }
    50  
    51  // Cap returns the iterator capacity
    52  func (i *SetIter[T]) Cap() (capacity int) {
    53  	if !(i == nil || i.elements == nil) {
    54  		capacity = len(*i.elements)
    55  	}
    56  	return capacity
    57  }
    58  
    59  // Delete deletes the current element
    60  func (i *SetIter[T]) Delete() {
    61  	if !(i == nil || i.elements == nil) {
    62  		if v, ok := slice.Gett(*i.elements, i.current); ok {
    63  			i.current--
    64  			i.del(v)
    65  		}
    66  	}
    67  }
    68  
    69  // Start is used with for loop construct like 'for i, val, ok := i.Start(); ok; val, ok = i.Next() { }'
    70  func (i *SetIter[T]) Start() (*SetIter[T], T, bool) {
    71  	n, ok := i.Next()
    72  	return i, n, ok
    73  }