package utils type Set[T comparable] interface { Items() []T // Union(set Set[T]) Set[T] // Intersection(set Set[T]) Set[T] // ContainsItem(item T) bool // ContainsSubset(set Set[T]) bool } type set[T comparable] struct { m map[T]bool } func (s *set[T]) Items() []T { r := make([]T, len(s.m)) i := 0 for item, _ := range s.m { r[i] = item i += 1 } return r } func NewSet[T comparable](items ...T) Set[T] { m := make(map[T]bool, len(items)) for _, item := range items { m[item] = true } return &set[T]{m} }