107 lines
2.0 KiB
Go
Executable File
107 lines
2.0 KiB
Go
Executable File
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}
|
|
}
|