package stringset import "strings" const testVersion = 3 type Set map[string]struct{} func New() Set { return make(Set) } func NewFromSlice(s []string) Set { set := make(Set) for _, v := range s { set[v] = struct{}{} } return set } func (set Set) Add(s string) { set[s] = struct{}{} } func (set Set) Delete(s string) { delete(set, s) } func (set Set) Has(s string) bool { _, ok := set[s] return ok } func (set Set) IsEmpty() bool { return len(set) == 0 } func (set Set) Len() int { return len(set) } func (set Set) Slice() []string { tmp := make([]string, 0, len(set)) for v := range set { tmp = append(tmp, v) } return tmp } func (set Set) String() string { tmp := make([]string, 0, len(set)) for v := range set { tmp = append(tmp, `"`+v+`"`) } return `{` + strings.Join(tmp, `, `) + `}` } func Equal(s1, s2 Set) bool { if len(s1) != len(s2) { return false } for v := range s1 { if _, ok := s2[v]; !ok { return false } } return true } func Subset(s1, s2 Set) bool { for v := range s1 { if _, ok := s2[v]; !ok { return false } } return true } func Disjoint(s1, s2 Set) bool { for v := range s1 { if _, ok := s2[v]; ok { return false } } return true } func Intersection(s1, s2 Set) Set { set := make(Set) for v := range s1 { if _, ok := s2[v]; ok { set[v] = struct{}{} } } return set } func Union(s1, s2 Set) Set { set := make(Set) for v := range s1 { set[v] = struct{}{} } for v := range s2 { set[v] = struct{}{} } return set } func Difference(s1, s2 Set) Set { set := make(Set) for v := range s1 { if _, ok := s2[v]; !ok { set[v] = struct{}{} } } return set } func SymmetricDifference(s1, s2 Set) Set { set := make(Set) for v := range s1 { if _, ok := s2[v]; !ok { set[v] = struct{}{} } } for v := range s2 { if _, ok := s1[v]; !ok { set[v] = struct{}{} } } return set }