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 }