123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- /*
- Open Source Initiative OSI - The MIT License (MIT):Licensing
- The MIT License (MIT)
- Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)
- Permission is hereby granted, free of charge, to any person obtaining a copy of
- this software and associated documentation files (the "Software"), to deal in
- the Software without restriction, including without limitation the rights to
- use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
- of the Software, and to permit persons to whom the Software is furnished to do
- so, subject to the following conditions:
- The above copyright notice and this permission notice shall be included in all
- copies or substantial portions of the Software.
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- SOFTWARE.
- */
- // 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.
- //
- // Package mapset provides two implementations. The default
- // implementation is safe for concurrent access. There is a non-threadsafe
- // implementation which is slightly more performant.
- package mapset
- type Set interface {
- // Adds an element to the set. Returns whether
- // the item was added.
- Add(i interface{}) bool
- // Returns the number of elements in the set.
- Cardinality() int
- // Removes all elements from the set, leaving
- // the emtpy set.
- Clear()
- // Returns a clone of the set using the same
- // implementation, duplicating all keys.
- Clone() Set
- // Returns whether the given items
- // are all in the set.
- Contains(i ...interface{}) bool
- // Returns the difference between this set
- // and other. 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
- // 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
- // Determines if every element in the other set
- // is in this 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
- // Determines if every element in this set is in
- // the other 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
- // Returns a channel of elements that you can
- // range over.
- Iter() <-chan interface{}
- // Remove a single element from the set.
- Remove(i interface{})
- // Provides a convenient string representation
- // of the current state of the set.
- String() string
- // Returns 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
- // Returns a new set with all elements in both sets.
- //
- // 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
- // Returns all subsets of a given set (Power Set).
- PowerSet() Set
- // Returns the Cartesian Product of two sets.
- CartesianProduct(other Set) Set
- // Returns the members of the set as a slice.
- ToSlice() []interface{}
- }
- // Creates and returns a reference to an empty set.
- func NewSet() Set {
- set := newThreadSafeSet()
- return &set
- }
- // Creates and returns a reference to a set from an existing slice
- func NewSetFromSlice(s []interface{}) Set {
- a := NewSet()
- for _, item := range s {
- a.Add(item)
- }
- return a
- }
- func NewThreadUnsafeSet() Set {
- set := newThreadUnsafeSet()
- return &set
- }
- func NewThreadUnsafeSetFromSlice(s []interface{}) Set {
- a := NewThreadUnsafeSet()
- for _, item := range s {
- a.Add(item)
- }
- return a
- }
|