func (s *Set) Each(f func(item int64) bool) {
	for item := range s.m {
		if !f(item) {
			break
		}
	}
}
Each traverses the items in the Set, calling the provided function for each
Set member. Traversal will continue until all items in the Set have been
visited, or if the closure returns false.
package i64set
import (
	"fmt"
	"strings"
)
var (
	keyExists   = struct{}{}
	nonExistent int64
)
const maxInt = int(^uint(0) >> 1)
type Set struct {
	m map[int64]struct{}
}
func New(ts ...int64) *Set {
	s := NewWithSize(len(ts))
	s.Add(ts...)
	return s
}
func NewWithSize(size int) *Set {
	return &Set{make(map[int64]struct{}, size)}
}
func (s *Set) Add(items ...int64) {
	for _, item := range items {
		s.m[item] = keyExists
	}
}
func (s *Set) Remove(items ...int64) {
	for _, item := range items {
		delete(s.m, item)
	}
}
func (s *Set) Pop() int64 {
	for item := range s.m {
		delete(s.m, item)
		return item
	}
	return nonExistent
}
func (s *Set) Pop2() (int64, bool) {
	for item := range s.m {
		delete(s.m, item)
		return item, true
	}
	return nonExistent, false
}
func (s *Set) Has(items ...int64) bool {
	has := false
	for _, item := range items {
		if _, has = s.m[item]; !has {
			break
		}
	}
	return has
}
func (s *Set) HasAny(items ...int64) bool {
	has := false
	for _, item := range items {
		if _, has = s.m[item]; has {
			break
		}
	}
	return has
}
func (s *Set) Size() int {
	return len(s.m)
}
func (s *Set) Clear() {
	s.m = make(map[int64]struct{})
}
func (s *Set) IsEmpty() bool {
	return s.Size() == 0
}
func (s *Set) IsEqual(t *Set) bool {
	if s.Size() != t.Size() {
		return false
	}
	equal := true
	t.Each(func(item int64) bool {
		_, equal = s.m[item]
		return equal  
	})
	return equal
}
func (s *Set) IsSubset(t *Set) bool {
	if s.Size() < t.Size() {
		return false
	}
	subset := true
	t.Each(func(item int64) bool {
		_, subset = s.m[item]
		return subset
	})
	return subset
}
func (s *Set) IsSuperset(t *Set) bool {
	return t.IsSubset(s)
}