github.com/m4gshm/gollections@v0.0.10/break/kv/loop/convert.go (about)

     1  package loop
     2  
     3  import (
     4  	"github.com/m4gshm/gollections/break/kv"
     5  	"github.com/m4gshm/gollections/break/loop"
     6  )
     7  
     8  // ConvertIter is the iterator wrapper implementation applying a converter to all iterable key/value elements.
     9  type ConvertIter[K, V any, K2, V2 any] struct {
    10  	next      func() (K, V, bool, error)
    11  	converter func(K, V) (K2, V2, error)
    12  }
    13  
    14  var (
    15  	_ kv.Iterator[any, any] = (*ConvertIter[any, any, any, any])(nil)
    16  	_ kv.Iterator[any, any] = ConvertIter[any, any, any, any]{}
    17  )
    18  
    19  var _ kv.IterFor[any, any, ConvertIter[any, any, any, any]] = ConvertIter[any, any, any, any]{}
    20  
    21  // Track takes key, value pairs retrieved by the iterator. Can be interrupt by returning ErrBreak
    22  func (i ConvertIter[K, V, K2, V2]) Track(traker func(key K2, value V2) error) error {
    23  	return loop.Track(i.Next, traker)
    24  }
    25  
    26  // Next returns the next key/value pair.
    27  // The ok result indicates whether an pair was returned by the iterator.
    28  // If ok == false, then the iteration must be completed.
    29  func (i ConvertIter[K, V, K2, V2]) Next() (k2 K2, v2 V2, ok bool, err error) {
    30  	if next := i.next; next != nil {
    31  		k, v, ok, err := next()
    32  		if err != nil || !ok {
    33  			return k2, v2, false, err
    34  		}
    35  		k2, v2, err = i.converter(k, v)
    36  		return k2, v2, err == nil, err
    37  	}
    38  	return k2, v2, false, nil
    39  }
    40  
    41  // Start is used with for loop construct like 'for i, k, v, ok, err := i.Start(); ok || err != nil ; k, v, ok, err = i.Next() { if err != nil { return err }}'
    42  func (i ConvertIter[K, V, K2, V2]) Start() (ConvertIter[K, V, K2, V2], K2, V2, bool, error) {
    43  	return startKvIt[K2, V2](i)
    44  }