|
|
|
@ -4,12 +4,10 @@ import "encoding/json"
|
|
|
|
|
|
|
|
|
|
type present struct{}
|
|
|
|
|
|
|
|
|
|
// Waiting for Go 18...
|
|
|
|
|
// type Set[T comparable] map[T]present
|
|
|
|
|
type StringSet map[string]present
|
|
|
|
|
type Set[T comparable] map[T]present
|
|
|
|
|
|
|
|
|
|
func NewStringSet(elements ...string) StringSet {
|
|
|
|
|
set := StringSet{}
|
|
|
|
|
func NewSet[T comparable](elements ...T) Set[T] {
|
|
|
|
|
set := Set[T]{}
|
|
|
|
|
|
|
|
|
|
for _, elem := range elements {
|
|
|
|
|
set.Add(elem)
|
|
|
|
@ -18,12 +16,12 @@ func NewStringSet(elements ...string) StringSet {
|
|
|
|
|
return set
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (set StringSet) Has(value string) bool {
|
|
|
|
|
func (set Set[T]) Has(value T) bool {
|
|
|
|
|
_, present := set[value]
|
|
|
|
|
return present
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (set StringSet) HasAny(values ...string) bool {
|
|
|
|
|
func (set Set[T]) HasAny(values ...T) bool {
|
|
|
|
|
for _, value := range values {
|
|
|
|
|
if _, present := set[value]; present {
|
|
|
|
|
return true
|
|
|
|
@ -32,7 +30,7 @@ func (set StringSet) HasAny(values ...string) bool {
|
|
|
|
|
return false
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (set StringSet) Contains(other StringSet) bool {
|
|
|
|
|
func (set Set[T]) Contains(other Set[T]) bool {
|
|
|
|
|
for v := range other {
|
|
|
|
|
if !set.Has(v) {
|
|
|
|
|
return false
|
|
|
|
@ -41,16 +39,16 @@ func (set StringSet) Contains(other StringSet) bool {
|
|
|
|
|
return true
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (set StringSet) Add(value string) {
|
|
|
|
|
func (set Set[T]) Add(value T) {
|
|
|
|
|
set[value] = present{}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (set StringSet) Remove(value string) {
|
|
|
|
|
func (set Set[T]) Remove(value T) {
|
|
|
|
|
delete(set, value)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (set StringSet) Elements() []string {
|
|
|
|
|
elements := []string{}
|
|
|
|
|
func (set Set[T]) Elements() []T {
|
|
|
|
|
elements := []T{}
|
|
|
|
|
|
|
|
|
|
for elem := range set {
|
|
|
|
|
elements = append(elements, elem)
|
|
|
|
@ -59,12 +57,12 @@ func (set StringSet) Elements() []string {
|
|
|
|
|
return elements
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (set StringSet) MarshalJSON() ([]byte, error) {
|
|
|
|
|
func (set Set[T]) MarshalJSON() ([]byte, error) {
|
|
|
|
|
return json.Marshal(set.Elements())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (set StringSet) UnmarshalJSON(data []byte) error {
|
|
|
|
|
elements := []string{}
|
|
|
|
|
func (set Set[T]) UnmarshalJSON(data []byte) error {
|
|
|
|
|
elements := []T{}
|
|
|
|
|
if err := json.Unmarshal(data, &elements); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|