Source file src/maps/iter.go

     1  // Copyright 2024 The Go Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package maps
     6  
     7  import "iter"
     8  
     9  // All returns an iterator over key-value pairs from m.
    10  // The iteration order is not specified and is not guaranteed
    11  // to be the same from one call to the next.
    12  func All[Map ~map[K]V, K comparable, V any](m Map) iter.Seq2[K, V] {
    13  	return func(yield func(K, V) bool) {
    14  		for k, v := range m {
    15  			if !yield(k, v) {
    16  				return
    17  			}
    18  		}
    19  	}
    20  }
    21  
    22  // Keys returns an iterator over keys in m.
    23  // The iteration order is not specified and is not guaranteed
    24  // to be the same from one call to the next.
    25  func Keys[Map ~map[K]V, K comparable, V any](m Map) iter.Seq[K] {
    26  	return func(yield func(K) bool) {
    27  		for k := range m {
    28  			if !yield(k) {
    29  				return
    30  			}
    31  		}
    32  	}
    33  }
    34  
    35  // Values returns an iterator over values in m.
    36  // The iteration order is not specified and is not guaranteed
    37  // to be the same from one call to the next.
    38  func Values[Map ~map[K]V, K comparable, V any](m Map) iter.Seq[V] {
    39  	return func(yield func(V) bool) {
    40  		for _, v := range m {
    41  			if !yield(v) {
    42  				return
    43  			}
    44  		}
    45  	}
    46  }
    47  
    48  // Insert adds the key-value pairs from seq to m.
    49  // If a key in seq already exists in m, its value will be overwritten.
    50  func Insert[Map ~map[K]V, K comparable, V any](m Map, seq iter.Seq2[K, V]) {
    51  	for k, v := range seq {
    52  		m[k] = v
    53  	}
    54  }
    55  
    56  // Collect collects key-value pairs from seq into a new map
    57  // and returns it.
    58  func Collect[K comparable, V any](seq iter.Seq2[K, V]) map[K]V {
    59  	m := make(map[K]V)
    60  	Insert(m, seq)
    61  	return m
    62  }
    63  

View as plain text