1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
|
package set
type (
Set struct {
hash map[interface{}]nothing
}
nothing struct{}
)
// Create a new set
func New(initial ...interface{}) *Set {
s := &Set{make(map[interface{}]nothing)}
for _, v := range initial {
s.Insert(v)
}
return s
}
// Find the difference between two sets
func (this *Set) Difference(set *Set) *Set {
n := make(map[interface{}]nothing)
for k, _ := range this.hash {
if _, exists := set.hash[k]; !exists {
n[k] = nothing{}
}
}
return &Set{n}
}
// Call f for each item in the set
func (this *Set) Do(f func(interface{})) {
for k, _ := range this.hash {
f(k)
}
}
// Test to see whether or not the element is in the set
func (this *Set) Has(element interface{}) bool {
_, exists := this.hash[element]
return exists
}
// Add an element to the set
func (this *Set) Insert(element interface{}) {
this.hash[element] = nothing{}
}
// Find the intersection of two sets
func (this *Set) Intersection(set *Set) *Set {
n := make(map[interface{}]nothing)
for k, _ := range this.hash {
if _, exists := set.hash[k]; exists {
n[k] = nothing{}
}
}
return &Set{n}
}
// Return the number of items in the set
func (this *Set) Len() int {
return len(this.hash)
}
// Test whether or not this set is a proper subset of "set"
func (this *Set) ProperSubsetOf(set *Set) bool {
return this.SubsetOf(set) && this.Len() < set.Len()
}
// Remove an element from the set
func (this *Set) Remove(element interface{}) {
delete(this.hash, element)
}
// Test whether or not this set is a subset of "set"
func (this *Set) SubsetOf(set *Set) bool {
if this.Len() > set.Len() {
return false
}
for k, _ := range this.hash {
if _, exists := set.hash[k]; !exists {
return false
}
}
return true
}
// Find the union of two sets
func (this *Set) Union(set *Set) *Set {
n := make(map[interface{}]nothing)
for k, _ := range this.hash {
n[k] = nothing{}
}
for k, _ := range set.hash {
n[k] = nothing{}
}
return &Set{n}
}
|