func (s1 StringSet) IsSuperset(s2 StringSet) bool {
	for item := range s2 {
		if !s1.Has(item) {
			return false
		}
	}
	return true
}
IsSuperset returns true iff s1 is a superset of s2.
package util
import (
	"reflect"
	"sort"
)
type empty struct{}
type StringSet map[string]empty
func NewStringSet(items ...string) StringSet {
	ss := StringSet{}
	ss.Insert(items...)
	return ss
}
func KeySet(theMap reflect.Value) StringSet {
	ret := StringSet{}
	for _, keyValue := range theMap.MapKeys() {
		ret.Insert(keyValue.String())
	}
	return ret
}
func (s StringSet) Insert(items ...string) {
	for _, item := range items {
		s[item] = empty{}
	}
}
func (s StringSet) Delete(items ...string) {
	for _, item := range items {
		delete(s, item)
	}
}
func (s StringSet) Has(item string) bool {
	_, contained := s[item]
	return contained
}
func (s StringSet) HasAll(items ...string) bool {
	for _, item := range items {
		if !s.Has(item) {
			return false
		}
	}
	return true
}
func (s StringSet) Difference(s2 StringSet) StringSet {
	result := NewStringSet()
	for key := range s {
		if !s2.Has(key) {
			result.Insert(key)
		}
	}
	return result
}