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 }