mirror of
https://github.com/HDT3213/godis.git
synced 2025-10-03 07:56:38 +08:00

wip: raft does not care about migrating wip: optimize code wip: raft election wip wip: fix raft leader missing log entries wip fix a dead lock batch set slot route wip: raft persist wip refactor cluster suite remove relay rename relay2 refactor: allow customizing client factory test raft refactor re-balance avoid errors caused by inconsistent status on follower nodes during raft commits test raft election
125 lines
2.5 KiB
Go
125 lines
2.5 KiB
Go
package set
|
|
|
|
import "github.com/hdt3213/godis/datastruct/dict"
|
|
|
|
// Set is a set of elements based on hash table
|
|
type Set struct {
|
|
dict dict.Dict
|
|
}
|
|
|
|
// Make creates a new set
|
|
func Make(members ...string) *Set {
|
|
set := &Set{
|
|
dict: dict.MakeSimple(),
|
|
}
|
|
for _, member := range members {
|
|
set.Add(member)
|
|
}
|
|
return set
|
|
}
|
|
|
|
// Add adds member into set
|
|
func (set *Set) Add(val string) int {
|
|
return set.dict.Put(val, nil)
|
|
}
|
|
|
|
// Remove removes member from set
|
|
func (set *Set) Remove(val string) int {
|
|
_, ret := set.dict.Remove(val)
|
|
return ret
|
|
}
|
|
|
|
// Has returns true if the val exists in the set
|
|
func (set *Set) Has(val string) bool {
|
|
_, exists := set.dict.Get(val)
|
|
return exists
|
|
}
|
|
|
|
// Len returns number of members in the set
|
|
func (set *Set) Len() int {
|
|
return set.dict.Len()
|
|
}
|
|
|
|
// ToSlice convert set to []string
|
|
func (set *Set) ToSlice() []string {
|
|
slice := make([]string, set.Len())
|
|
i := 0
|
|
set.dict.ForEach(func(key string, val interface{}) bool {
|
|
if i < len(slice) {
|
|
slice[i] = key
|
|
} else {
|
|
// set extended during traversal
|
|
slice = append(slice, key)
|
|
}
|
|
i++
|
|
return true
|
|
})
|
|
return slice
|
|
}
|
|
|
|
// ForEach visits each member in the set
|
|
func (set *Set) ForEach(consumer func(member string) bool) {
|
|
set.dict.ForEach(func(key string, val interface{}) bool {
|
|
return consumer(key)
|
|
})
|
|
}
|
|
|
|
// Intersect intersects two sets
|
|
func (set *Set) Intersect(another *Set) *Set {
|
|
if set == nil {
|
|
panic("set is nil")
|
|
}
|
|
|
|
result := Make()
|
|
another.ForEach(func(member string) bool {
|
|
if set.Has(member) {
|
|
result.Add(member)
|
|
}
|
|
return true
|
|
})
|
|
return result
|
|
}
|
|
|
|
// Union adds two sets
|
|
func (set *Set) Union(another *Set) *Set {
|
|
if set == nil {
|
|
panic("set is nil")
|
|
}
|
|
result := Make()
|
|
another.ForEach(func(member string) bool {
|
|
result.Add(member)
|
|
return true
|
|
})
|
|
set.ForEach(func(member string) bool {
|
|
result.Add(member)
|
|
return true
|
|
})
|
|
return result
|
|
}
|
|
|
|
// Diff subtracts two sets
|
|
func (set *Set) Diff(another *Set) *Set {
|
|
if set == nil {
|
|
panic("set is nil")
|
|
}
|
|
|
|
result := Make()
|
|
set.ForEach(func(member string) bool {
|
|
if !another.Has(member) {
|
|
result.Add(member)
|
|
}
|
|
return true
|
|
})
|
|
return result
|
|
}
|
|
|
|
// RandomMembers randomly returns keys of the given number, may contain duplicated key
|
|
func (set *Set) RandomMembers(limit int) []string {
|
|
return set.dict.RandomKeys(limit)
|
|
}
|
|
|
|
// RandomDistinctMembers randomly returns keys of the given number, won't contain duplicated key
|
|
func (set *Set) RandomDistinctMembers(limit int) []string {
|
|
return set.dict.RandomDistinctKeys(limit)
|
|
}
|