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  }