| // 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 main | |
| import ( | |
| "./a" | |
| ) | |
| // Creates copy of set | |
| func Copy[T comparable](src MapSet[T]) (dst MapSet[T]) { | |
| dst = HashSet[T](src.Len()) | |
| Fill(src, dst) | |
| return | |
| } | |
| // Fill src from dst | |
| func Fill[T any](src, dst MapSet[T]) { | |
| src.Iterate(func(t T) bool { | |
| dst.Add(t) | |
| return true | |
| }) | |
| return | |
| } | |
| type MapSet[T any] struct { | |
| m a.Map[T, struct{}] | |
| } | |
| func HashSet[T comparable](capacity int) MapSet[T] { | |
| return FromMap[T](a.NewHashMap[T, struct{}](capacity)) | |
| } | |
| func FromMap[T any](m a.Map[T, struct{}]) MapSet[T] { | |
| return MapSet[T]{ | |
| m: m, | |
| } | |
| } | |
| func (s MapSet[T]) Add(t T) { | |
| s.m.Put(t, struct{}{}) | |
| } | |
| func (s MapSet[T]) Len() int { | |
| return s.m.Len() | |
| } | |
| func (s MapSet[T]) Iterate(cb func(T) bool) { | |
| s.m.Iterate(func(p a.Pair[T, struct{}]) bool { | |
| return cb(p.L) | |
| }) | |
| } | |
| func main() { | |
| x := FromMap[int](a.NewHashMap[int, struct{}](1)) | |
| Copy[int](x) | |
| } | |