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 }