Documentation
¶
Overview ¶
Package mapset implements a simple and generic set collection. Items stored within it are unordered and unique. It supports typical set operations: membership testing, intersection, union, difference, symmetric difference and cloning.
mapset provides two implementations of the Set interface. The default implementation is safe for concurrent access, but a non-thread-safe implementation is also provided for programs that can benefit from the slight complexity improvement and that can enforce mutual exclusion through other means.
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Iterator ¶
type Iterator struct {
C <-chan interface{}
// contains filtered or unexported fields
}
Iterator defines an iterator over a Set, its C channel can be used to range over the Set's elements.
Example ¶
package main
import (
"fmt"
)
type YourType struct {
Name string
}
func main() {
set := NewSet(
&YourType{Name: "Alise"},
&YourType{Name: "Bob"},
&YourType{Name: "John"},
&YourType{Name: "Nick"},
)
var found *YourType
it := set.Iterator()
for elem := range it.C {
if elem.(*YourType).Name == "John" {
found = elem.(*YourType)
it.Stop()
}
}
fmt.Printf("Found %+v\n", found)
}
Output: Found &{Name:John}
type OrderedPair ¶
type OrderedPair struct {
First interface{}
Second interface{}
}
OrderedPair represents a 2-tuple of values.
func (*OrderedPair) Equal ¶
func (pair *OrderedPair) Equal(other OrderedPair) bool
Equal determines of this pair equals the given pair.
func (OrderedPair) String ¶
func (pair OrderedPair) String() string
String outputs a 2-tuple in the form "(A, B)".
type Set ¶
type Set interface {
hashstructure.Hashable
// UpdateHash updates the currently calculated hash of the set.
// Use it if underlying elements are mutable and once they may have been changed.
// It's not necessary to update the hashes but comparators will treat the element as if was not changed.
// UpdateHash returns the number of updated hashes, and thus, the modified elements.
UpdateHash() (updated int)
// Add the given elements to this set.
Add(i ...interface{})
// Cardinality determines the number of elements in the set.
Cardinality() int
// Clear removes all elements from the set, leaving the empty set.
Clear()
// Clone produces a clone of the set using the same implementation, duplicating all keys.
Clone() Set
// Contains determines whether the given items are all in the set.
Contains(i ...interface{}) bool
// Difference determines the difference between this set and the given set. The returned set will contain
// all elements of this set that are not also elements of other.
//
// Note that the argument to Difference must be of the same type as the receiver of the method.
// Otherwise, Difference will panic.
Difference(other Set) Set
// Equal determines if two sets are equal to each other. If they have the same cardinality and contain the same
// elements, they are considered equal. The order in which the elements were added is irrelevant.
//
// Note that the argument to Equal must be of the same type as the receiver of the method.
// Otherwise, Equal will panic.
Equal(other Set) bool
// Returns a new set containing only the elements that exist only in both sets.
//
// Note that the argument to Intersect must be of the same type as the receiver of the method.
// Otherwise, Intersect will panic.
Intersect(other Set) Set
// IsProperSubset determines if every element in this set is in the other set but the two sets are not equal.
//
// Note that the argument to IsProperSubset must be of the same type as the receiver of the method.
// Otherwise, IsProperSubset will panic.
IsProperSubset(other Set) bool
// IsProperSuperset determines if every element in the other set is in this set but the two sets are notequal.
//
// Note that the argument to IsSuperset must be of the same type as the receiver of the method.
// Otherwise, IsSuperset will panic.
IsProperSuperset(other Set) bool
// IsSubset determines if every element in this set is in the other set.
//
// Note that the argument to IsSubset must be of the same type as the receiver of the method.
// Otherwise, IsSubset will panic.
IsSubset(other Set) bool
// IsSuperset determines if every element in the other set is in this set.
//
// Note that the argument to IsSuperset must be of the same type as the receiver of the method.
// Otherwise, IsSuperset will panic.
IsSuperset(other Set) bool
// Each iterates over elements and executes the passed func against each element.
// If passed func returns true, stop iteration eagerly.
Each(func(interface{}) bool)
// Iter returns a channel of elements that you can range over.
Iter() <-chan interface{}
// Iterator that you can use to range over the set.
Iterator() *Iterator
// Remove the given elements from this set.
Remove(i ...interface{})
// String provides a convenient string representation of the current state of the set.
String() string
// SymmetricDifference provides a new set with all elements which are in either this set or the other set
// but not in both.
//
// Note that the argument to SymmetricDifference must be of the same type as the receiver of the method.
// Otherwise, SymmetricDifference will panic.
SymmetricDifference(other Set) Set
// Union provides a new set with all elements in this set and the given set.
//
// Note that the argument to Union must be of the same type as the receiver of the method.
// Otherwise, IsSuperset will panic.
Union(other Set) Set
// Pop removes and returns an arbitrary item from the set.
Pop() interface{}
// PowerSet builds all subsets of a given set (Power Set).
PowerSet() Set
// CartesianProduct builds the Cartesian Product of this set and the given set.
CartesianProduct(other Set) Set
// ToSlice converts the members of the set as to a slice.
ToSlice() []interface{}
// CoreSet provides the non-thread-safe core set.
CoreSet() threadUnsafeSet
// ThreadSafe provides the thread-safe core set.
ThreadSafe() *threadSafeSet
// MarshalJSON creates a JSON array from the set, it marshals all elements
MarshalJSON() ([]byte, error)
// UnmarshalJSON recreates a set from a JSON array, it only decodes primitive types.
// Numbers are decoded as json.Number.
UnmarshalJSON(p []byte) error
}
Set is the primary interface provided by the mapset package. It represents an unordered set of data and a large number of operations that can be applied to that set.
func NewSet ¶
func NewSet(elements ...interface{}) Set
NewSet creates a set that contains the given elements. Operations on the resulting set are thread-safe.
func NewUnsafeSet ¶
func NewUnsafeSet(elements ...interface{}) Set
NewUnsafeSet creates a set that contains the given elements. Operations on the resulting set are not thread-safe.
type SetOptions ¶
type SetOptions struct {
// Cache enables the hashing cache so that previously added items can be quickly looked up.
// The cache improves performance of comparable items and builtins.
// The performance is only increased since golang hashing is slow due to the reflection used in the byte.Writer.
// Unless generics or fast type checks are introduced in golang, this option trades some memory for performance.
Cache bool
// Unsafe makes the set non-thread-safe.
Unsafe bool
// Hasher overrides the default hash function.
Hasher hash.Hash64
}
SetOptions contain options that affect the set construction.
func (SetOptions) New ¶
func (o SetOptions) New(elements ...interface{}) (set Set)
New creates a new set with the given options.