github.com/altipla-consulting/ravendb-go-client@v0.1.3/object_set.go (about)

     1  package ravendb
     2  
     3  // TODO: objectSet is only used for deletedEntities and probably
     4  // doesn't need to be a set i.e. duplicates are ok
     5  
     6  // remove duplicate objects from a. It's somewhat expensive O(n^2) but
     7  // so is every other way of doing this.
     8  // we could use a hash for a one-time pass but that would restrict
     9  // possible values to only hashables (e.g. not map)
    10  // TODO: write tests
    11  /*
    12  func removeDuplicatesFromObjectSet(a []interface{}) []interface{} {
    13  	n := len(a)
    14  	for i := 0; i < n; i++ {
    15  		el := a[i]
    16  		found := false
    17  		n := len(a)
    18  		for j := i; !found && j < n; j++ {
    19  			el2 := a[j]
    20  			if el == el2 {
    21  				found = true
    22  				a[j] = a[n-1]
    23  				a[n-1] = nil
    24  				a = a[:n-1]
    25  				n--
    26  				if i == j {
    27  					i--
    28  				}
    29  			}
    30  		}
    31  	}
    32  	return a
    33  }
    34  */
    35  
    36  // TODO: possibly use []interface{} to be more efficient, assuming this doesn't
    37  // grow to large number of items
    38  type objectSet struct {
    39  	items map[interface{}]struct{}
    40  }
    41  
    42  func newObjectSet() *objectSet {
    43  	return &objectSet{
    44  		items: map[interface{}]struct{}{},
    45  	}
    46  }
    47  
    48  func (s *objectSet) add(o interface{}) {
    49  	s.items[o] = struct{}{}
    50  }
    51  
    52  func (s *objectSet) remove(o interface{}) {
    53  	delete(s.items, o)
    54  }
    55  
    56  func (s *objectSet) contains(o interface{}) bool {
    57  	_, ok := s.items[o]
    58  	return ok
    59  }
    60  
    61  func (s *objectSet) clear() {
    62  	s.items = map[interface{}]struct{}{}
    63  }
    64  
    65  func (s *objectSet) isEmpty() bool {
    66  	return len(s.items) == 0
    67  }