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 }