github.com/hdt3213/godis@v1.2.9/datastruct/set/set.go (about) 1 package set 2 3 import ( 4 "github.com/hdt3213/godis/datastruct/dict" 5 ) 6 7 // Set is a set of elements based on hash table 8 type Set struct { 9 dict dict.Dict 10 } 11 12 // Make creates a new set 13 func Make(members ...string) *Set { 14 set := &Set{ 15 dict: dict.MakeSimple(), 16 } 17 for _, member := range members { 18 set.Add(member) 19 } 20 return set 21 } 22 23 // Add adds member into set 24 func (set *Set) Add(val string) int { 25 return set.dict.Put(val, nil) 26 } 27 28 // Remove removes member from set 29 func (set *Set) Remove(val string) int { 30 return set.dict.Remove(val) 31 } 32 33 // Has returns true if the val exists in the set 34 func (set *Set) Has(val string) bool { 35 if set == nil || set.dict == nil { 36 return false 37 } 38 _, exists := set.dict.Get(val) 39 return exists 40 } 41 42 // Len returns number of members in the set 43 func (set *Set) Len() int { 44 if set == nil || set.dict == nil { 45 return 0 46 } 47 return set.dict.Len() 48 } 49 50 // ToSlice convert set to []string 51 func (set *Set) ToSlice() []string { 52 slice := make([]string, set.Len()) 53 i := 0 54 set.dict.ForEach(func(key string, val interface{}) bool { 55 if i < len(slice) { 56 slice[i] = key 57 } else { 58 // set extended during traversal 59 slice = append(slice, key) 60 } 61 i++ 62 return true 63 }) 64 return slice 65 } 66 67 // ForEach visits each member in the set 68 func (set *Set) ForEach(consumer func(member string) bool) { 69 if set == nil || set.dict == nil { 70 return 71 } 72 set.dict.ForEach(func(key string, val interface{}) bool { 73 return consumer(key) 74 }) 75 } 76 77 // ShallowCopy copies all members to another set 78 func (set *Set) ShallowCopy() *Set { 79 result := Make() 80 set.ForEach(func(member string) bool { 81 result.Add(member) 82 return true 83 }) 84 return result 85 } 86 87 // Intersect intersects two sets 88 func Intersect(sets ...*Set) *Set { 89 result := Make() 90 if len(sets) == 0 { 91 return result 92 } 93 94 countMap := make(map[string]int) 95 for _, set := range sets { 96 set.ForEach(func(member string) bool { 97 countMap[member]++ 98 return true 99 }) 100 } 101 for k, v := range countMap { 102 if v == len(sets) { 103 result.Add(k) 104 } 105 } 106 return result 107 } 108 109 // Union adds two sets 110 func Union(sets ...*Set) *Set { 111 result := Make() 112 for _, set := range sets { 113 set.ForEach(func(member string) bool { 114 result.Add(member) 115 return true 116 }) 117 } 118 return result 119 } 120 121 // Diff subtracts two sets 122 func Diff(sets ...*Set) *Set { 123 if len(sets) == 0 { 124 return Make() 125 } 126 result := sets[0].ShallowCopy() 127 for i := 1; i < len(sets); i++ { 128 sets[i].ForEach(func(member string) bool { 129 result.Remove(member) 130 return true 131 }) 132 if result.Len() == 0 { 133 break 134 } 135 } 136 return result 137 } 138 139 // RandomMembers randomly returns keys of the given number, may contain duplicated key 140 func (set *Set) RandomMembers(limit int) []string { 141 if set == nil || set.dict == nil { 142 return nil 143 } 144 return set.dict.RandomKeys(limit) 145 } 146 147 // RandomDistinctMembers randomly returns keys of the given number, won't contain duplicated key 148 func (set *Set) RandomDistinctMembers(limit int) []string { 149 return set.dict.RandomDistinctKeys(limit) 150 }