// 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)
}
