github.com/go-asm/go@v1.21.1-0.20240213172139-40c5ead50c48/cmd/compile/syntax/testdata/map2.go (about)

     1  // Copyright 2019 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  // This file is like map.go, but instead of importing chans, it contains
     6  // the necessary functionality at the end of the file.
     7  
     8  // Package orderedmap provides an ordered map, implemented as a binary tree.
     9  package orderedmap
    10  
    11  // Map is an ordered map.
    12  type Map[K, V any] struct {
    13  	root    *node[K, V]
    14  	compare func(K, K) int
    15  }
    16  
    17  // node is the type of a node in the binary tree.
    18  type node[K, V any] struct {
    19  	key         K
    20  	val         V
    21  	left, right *node[K, V]
    22  }
    23  
    24  // New returns a new map.
    25  func New[K, V any](compare func(K, K) int) *Map[K, V] {
    26  	return &Map[K, V]{compare: compare}
    27  }
    28  
    29  // find looks up key in the map, and returns either a pointer
    30  // to the node holding key, or a pointer to the location where
    31  // such a node would go.
    32  func (m *Map[K, V]) find(key K) **node[K, V] {
    33  	pn := &m.root
    34  	for *pn != nil {
    35  		switch cmp := m.compare(key, (*pn).key); {
    36  		case cmp < 0:
    37  			pn = &(*pn).left
    38  		case cmp > 0:
    39  			pn = &(*pn).right
    40  		default:
    41  			return pn
    42  		}
    43  	}
    44  	return pn
    45  }
    46  
    47  // Insert inserts a new key/value into the map.
    48  // If the key is already present, the value is replaced.
    49  // Returns true if this is a new key, false if already present.
    50  func (m *Map[K, V]) Insert(key K, val V) bool {
    51  	pn := m.find(key)
    52  	if *pn != nil {
    53  		(*pn).val = val
    54  		return false
    55  	}
    56  	*pn = &node[K, V]{key: key, val: val}
    57  	return true
    58  }
    59  
    60  // Find returns the value associated with a key, or zero if not present.
    61  // The found result reports whether the key was found.
    62  func (m *Map[K, V]) Find(key K) (V, bool) {
    63  	pn := m.find(key)
    64  	if *pn == nil {
    65  		var zero V // see the discussion of zero values, above
    66  		return zero, false
    67  	}
    68  	return (*pn).val, true
    69  }
    70  
    71  // keyValue is a pair of key and value used when iterating.
    72  type keyValue[K, V any] struct {
    73  	key K
    74  	val V
    75  }
    76  
    77  // InOrder returns an iterator that does an in-order traversal of the map.
    78  func (m *Map[K, V]) InOrder() *Iterator[K, V] {
    79  	sender, receiver := chans_Ranger[keyValue[K, V]]()
    80  	var f func(*node[K, V]) bool
    81  	f = func(n *node[K, V]) bool {
    82  		if n == nil {
    83  			return true
    84  		}
    85  		// Stop sending values if sender.Send returns false,
    86  		// meaning that nothing is listening at the receiver end.
    87  		return f(n.left) &&
    88  			sender.Send(keyValue[K, V]{n.key, n.val}) &&
    89  			f(n.right)
    90  	}
    91  	go func() {
    92  		f(m.root)
    93  		sender.Close()
    94  	}()
    95  	return &Iterator[K, V]{receiver}
    96  }
    97  
    98  // Iterator is used to iterate over the map.
    99  type Iterator[K, V any] struct {
   100  	r *chans_Receiver[keyValue[K, V]]
   101  }
   102  
   103  // Next returns the next key and value pair, and a boolean indicating
   104  // whether they are valid or whether we have reached the end.
   105  func (it *Iterator[K, V]) Next() (K, V, bool) {
   106  	keyval, ok := it.r.Next()
   107  	if !ok {
   108  		var zerok K
   109  		var zerov V
   110  		return zerok, zerov, false
   111  	}
   112  	return keyval.key, keyval.val, true
   113  }
   114  
   115  // chans
   116  
   117  func chans_Ranger[T any]() (*chans_Sender[T], *chans_Receiver[T])
   118  
   119  // A sender is used to send values to a Receiver.
   120  type chans_Sender[T any] struct {
   121  	values chan<- T
   122  	done   <-chan bool
   123  }
   124  
   125  func (s *chans_Sender[T]) Send(v T) bool {
   126  	select {
   127  	case s.values <- v:
   128  		return true
   129  	case <-s.done:
   130  		return false
   131  	}
   132  }
   133  
   134  func (s *chans_Sender[T]) Close() {
   135  	close(s.values)
   136  }
   137  
   138  type chans_Receiver[T any] struct {
   139  	values <-chan T
   140  	done   chan<- bool
   141  }
   142  
   143  func (r *chans_Receiver[T]) Next() (T, bool) {
   144  	v, ok := <-r.values
   145  	return v, ok
   146  }