| // Copyright 2021 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package a |
| |
| type Pair[L, R any] struct { |
| L L |
| R R |
| } |
| |
| func Two[L, R any](l L, r R) Pair[L, R] { |
| return Pair[L, R]{L: l, R: r} |
| } |
| |
| type Map[K, V any] interface { |
| Put(K, V) |
| Len() int |
| Iterate(func(Pair[K, V]) bool) |
| } |
| |
| type HashMap[K comparable, V any] struct { |
| m map[K]V |
| } |
| |
| func NewHashMap[K comparable, V any](capacity int) HashMap[K, V] { |
| var m map[K]V |
| if capacity >= 1 { |
| m = make(map[K]V, capacity) |
| } else { |
| m = map[K]V{} |
| } |
| |
| return HashMap[K, V]{m: m} |
| } |
| |
| func (m HashMap[K, V]) Put(k K, v V) { |
| m.m[k] = v |
| } |
| |
| func (m HashMap[K, V]) Len() int { |
| return len(m.m) |
| } |
| |
| func (m HashMap[K, V]) Iterate(cb func(Pair[K, V]) bool) { |
| for k, v := range m.m { |
| if !cb(Two(k, v)) { |
| return |
| } |
| } |
| } |