package util import "encoding/json" type present struct{} // Waiting for Go 18... // type Set[T comparable] map[T]present type StringSet map[string]present func NewStringSet(elements ...string) StringSet { set := StringSet{} for _, elem := range elements { set.Add(elem) } return set } func (set StringSet) Has(value string) bool { _, present := set[value] return present } func (set StringSet) HasAny(values ...string) bool { for _, value := range values { if _, present := set[value]; present { return true } } return false } func (set StringSet) Contains(other StringSet) bool { for v := range other { if !set.Has(v) { return false } } return true } func (set StringSet) Add(value string) { set[value] = present{} } func (set StringSet) Remove(value string) { delete(set, value) } func (set StringSet) Elements() []string { elements := []string{} for elem := range set { elements = append(elements, elem) } return elements } func (set StringSet) MarshalJSON() ([]byte, error) { return json.Marshal(set.Elements()) } func (set StringSet) UnmarshalJSON(data []byte) error { elements := []string{} if err := json.Unmarshal(data, &elements); err != nil { return err } for _, v := range elements { set.Add(v) } return nil }