github.com/cli/cli@v1.14.1-0.20210902173923-1af6a669e342/pkg/set/string_set.go (about)

     1  package set
     2  
     3  var exists = struct{}{}
     4  
     5  type stringSet struct {
     6  	v []string
     7  	m map[string]struct{}
     8  }
     9  
    10  func NewStringSet() *stringSet {
    11  	s := &stringSet{}
    12  	s.m = make(map[string]struct{})
    13  	return s
    14  }
    15  
    16  func (s *stringSet) Add(value string) {
    17  	if s.Contains(value) {
    18  		return
    19  	}
    20  	s.m[value] = exists
    21  	s.v = append(s.v, value)
    22  }
    23  
    24  func (s *stringSet) AddValues(values []string) {
    25  	for _, v := range values {
    26  		s.Add(v)
    27  	}
    28  }
    29  
    30  func (s *stringSet) Remove(value string) {
    31  	if !s.Contains(value) {
    32  		return
    33  	}
    34  	delete(s.m, value)
    35  	s.v = sliceWithout(s.v, value)
    36  }
    37  
    38  func sliceWithout(s []string, v string) []string {
    39  	idx := -1
    40  	for i, item := range s {
    41  		if item == v {
    42  			idx = i
    43  			break
    44  		}
    45  	}
    46  	if idx < 0 {
    47  		return s
    48  	}
    49  	return append(s[:idx], s[idx+1:]...)
    50  }
    51  
    52  func (s *stringSet) RemoveValues(values []string) {
    53  	for _, v := range values {
    54  		s.Remove(v)
    55  	}
    56  }
    57  
    58  func (s *stringSet) Contains(value string) bool {
    59  	_, c := s.m[value]
    60  	return c
    61  }
    62  
    63  func (s *stringSet) Len() int {
    64  	return len(s.m)
    65  }
    66  
    67  func (s *stringSet) ToSlice() []string {
    68  	return s.v
    69  }