package gopherdiscovery // Set is a modification of https://github.com/deckarep/golang-set // The MIT License (MIT) // Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com) // StringSet is the primary type that represents a set type StringSet map[string]struct{} // NewStringSet creates and returns a reference to an empty set. // func NewStringSet(a ...string) StringSet { // s := make(StringSet) // for _, i := range a { // s.Add(i) // } // return s // } // NewStringSet creates and returns a reference to an empty set. func NewStringSet() StringSet { s := make(StringSet) return s } // ToSlice returns the elements of the current set as a slice func (set StringSet) ToSlice() []string { var s []string for v := range set { s = append(s, v) } return s } // Add adds an item to the current set if it doesn't already exist in the set. func (set StringSet) Add(i string) bool { _, found := set[i] set[i] = struct{}{} return !found //False if it existed already } // Contains determines if a given item is already in the set. func (set StringSet) Contains(i string) bool { _, found := set[i] return found } // // ContainsAll determines if the given items are all in the set // func (set StringSet) ContainsAll(i ...string) bool { // for _, v := range i { // if !set.Contains(v) { // return false // } // } // return true // } // // IsSubset determines if every item in the other set is in this set. // func (set StringSet) IsSubset(other StringSet) bool { // for elem := range set { // if !other.Contains(elem) { // return false // } // } // return true // } // // IsSuperset determines if every item of this set is in the other set. // func (set StringSet) IsSuperset(other StringSet) bool { // return other.IsSubset(set) // } // // Union returns a new set with all items in both sets. // func (set StringSet) Union(other StringSet) StringSet { // unionedSet := NewStringSet() // for elem := range set { // unionedSet.Add(elem) // } // for elem := range other { // unionedSet.Add(elem) // } // return unionedSet // } // // Intersect returns a new set with items that exist only in both sets. // func (set StringSet) Intersect(other StringSet) StringSet { // intersection := NewStringSet() // // loop over smaller set // if set.Cardinality() < other.Cardinality() { // for elem := range set { // if other.Contains(elem) { // intersection.Add(elem) // } // } // } else { // for elem := range other { // if set.Contains(elem) { // intersection.Add(elem) // } // } // } // return intersection // } // Difference returns a new set with items in the current set but not in the other set func (set StringSet) Difference(other StringSet) StringSet { differencedSet := NewStringSet() for elem := range set { if !other.Contains(elem) { differencedSet.Add(elem) } } return differencedSet } // // SymmetricDifference returns a new set with items in the current set or the other set but not in both. // func (set StringSet) SymmetricDifference(other StringSet) StringSet { // aDiff := set.Difference(other) // bDiff := other.Difference(set) // return aDiff.Union(bDiff) // } // // Clear clears the entire set to be the empty set. // func (set *StringSet) Clear() { // *set = make(StringSet) // } // // Remove allows the removal of a single item in the set. // func (set StringSet) Remove(i string) { // delete(set, i) // } // Cardinality returns how many items are currently in the set. func (set StringSet) Cardinality() int { return len(set) } // Iter returns a channel of type string that you can range over. // func (set StringSet) Iter() <-chan string { // ch := make(chan string) // go func() { // for elem := range set { // ch <- elem // } // close(ch) // }() // return ch // } // // Equal determines if two sets are equal to each other. // // If they both are the same size and have the same items they are considered equal. // // Order of items is not relevent for sets to be equal. // func (set StringSet) Equal(other StringSet) bool { // if set.Cardinality() != other.Cardinality() { // return false // } // for elem := range set { // if !other.Contains(elem) { // return false // } // } // return true // } // Clone returns a clone of the set. // Does NOT clone the underlying elements. // func (set StringSet) Clone() StringSet { // clonedSet := NewStringSet() // for elem := range set { // clonedSet.Add(elem) // } // return clonedSet // }