github.com/2lambda123/git-lfs@v2.5.2+incompatible/tools/stringset.go (about)

     1  // Generated by: gen, modified by Steve Streeting
     2  // TypeWriter: container
     3  // Directive: +gen on main.string
     4  
     5  // See http://clipperhouse.github.io/gen for documentation
     6  
     7  // Set is a modification of https://github.com/deckarep/golang-set
     8  // The MIT License (MIT)
     9  // Copyright (c) 2013 Ralph Caraveo (deckarep@gmail.com)
    10  package tools
    11  
    12  // The primary type that represents a set
    13  type StringSet map[string]struct{}
    14  
    15  // Creates and returns a reference to an empty set.
    16  func NewStringSet() StringSet {
    17  	return make(StringSet)
    18  }
    19  
    20  // Creates and returns a reference to an empty set with a capacity.
    21  func NewStringSetWithCapacity(capacity int) StringSet {
    22  	return make(StringSet, capacity)
    23  }
    24  
    25  // Creates and returns a reference to a set from an existing slice
    26  func NewStringSetFromSlice(s []string) StringSet {
    27  	a := NewStringSetWithCapacity(len(s))
    28  	for _, item := range s {
    29  		a.Add(item)
    30  	}
    31  	return a
    32  }
    33  
    34  // Adds an item to the current set if it doesn't already exist in the set.
    35  func (set StringSet) Add(i string) bool {
    36  	_, found := set[i]
    37  	set[i] = struct{}{}
    38  	return !found //False if it e  xisted already
    39  }
    40  
    41  // Determines if a given item is already in the set.
    42  func (set StringSet) Contains(i string) bool {
    43  	_, found := set[i]
    44  	return found
    45  }
    46  
    47  // Determines if the given items are all in the set
    48  func (set StringSet) ContainsAll(i ...string) bool {
    49  	allSet := NewStringSetFromSlice(i)
    50  	if allSet.IsSubset(set) {
    51  		return true
    52  	}
    53  	return false
    54  }
    55  
    56  // Determines if every item in the other set is in this set.
    57  func (set StringSet) IsSubset(other StringSet) bool {
    58  	for elem := range set {
    59  		if !other.Contains(elem) {
    60  			return false
    61  		}
    62  	}
    63  	return true
    64  }
    65  
    66  // Determines if every item of this set is in the other set.
    67  func (set StringSet) IsSuperset(other StringSet) bool {
    68  	return other.IsSubset(set)
    69  }
    70  
    71  // Returns a new set with all items in both sets.
    72  func (set StringSet) Union(other StringSet) StringSet {
    73  	unionedSet := NewStringSet()
    74  
    75  	for elem := range set {
    76  		unionedSet.Add(elem)
    77  	}
    78  	for elem := range other {
    79  		unionedSet.Add(elem)
    80  	}
    81  	return unionedSet
    82  }
    83  
    84  // Returns a new set with items that exist only in both sets.
    85  func (set StringSet) Intersect(other StringSet) StringSet {
    86  	intersection := NewStringSet()
    87  	// loop over smaller set
    88  	if set.Cardinality() < other.Cardinality() {
    89  		for elem := range set {
    90  			if other.Contains(elem) {
    91  				intersection.Add(elem)
    92  			}
    93  		}
    94  	} else {
    95  		for elem := range other {
    96  			if set.Contains(elem) {
    97  				intersection.Add(elem)
    98  			}
    99  		}
   100  	}
   101  	return intersection
   102  }
   103  
   104  // Returns a new set with items in the current set but not in the other set
   105  func (set StringSet) Difference(other StringSet) StringSet {
   106  	differencedSet := NewStringSet()
   107  	for elem := range set {
   108  		if !other.Contains(elem) {
   109  			differencedSet.Add(elem)
   110  		}
   111  	}
   112  	return differencedSet
   113  }
   114  
   115  // Returns a new set with items in the current set or the other set but not in both.
   116  func (set StringSet) SymmetricDifference(other StringSet) StringSet {
   117  	aDiff := set.Difference(other)
   118  	bDiff := other.Difference(set)
   119  	return aDiff.Union(bDiff)
   120  }
   121  
   122  // Clears the entire set to be the empty set.
   123  func (set *StringSet) Clear() {
   124  	*set = make(StringSet)
   125  }
   126  
   127  // Allows the removal of a single item in the set.
   128  func (set StringSet) Remove(i string) {
   129  	delete(set, i)
   130  }
   131  
   132  // Cardinality returns how many items are currently in the set.
   133  func (set StringSet) Cardinality() int {
   134  	return len(set)
   135  }
   136  
   137  // Iter() returns a channel of type string that you can range over.
   138  func (set StringSet) Iter() <-chan string {
   139  	ch := make(chan string)
   140  	go func() {
   141  		for elem := range set {
   142  			ch <- elem
   143  		}
   144  		close(ch)
   145  	}()
   146  
   147  	return ch
   148  }
   149  
   150  // Equal determines if two sets are equal to each other.
   151  // If they both are the same size and have the same items they are considered equal.
   152  // Order of items is not relevent for sets to be equal.
   153  func (set StringSet) Equal(other StringSet) bool {
   154  	if set.Cardinality() != other.Cardinality() {
   155  		return false
   156  	}
   157  	for elem := range set {
   158  		if !other.Contains(elem) {
   159  			return false
   160  		}
   161  	}
   162  	return true
   163  }
   164  
   165  // Returns a clone of the set.
   166  // Does NOT clone the underlying elements.
   167  func (set StringSet) Clone() StringSet {
   168  	clonedSet := NewStringSet()
   169  	for elem := range set {
   170  		clonedSet.Add(elem)
   171  	}
   172  	return clonedSet
   173  }