github.com/informationsea/shellflow@v0.1.3/flowscript/flowscript_stringset.go (about) 1 package flowscript 2 3 import ( 4 "encoding/json" 5 "sort" 6 ) 7 8 type StringSet struct { 9 set map[string]struct{} 10 } 11 12 func NewStringSet() StringSet { 13 return StringSet{ 14 set: make(map[string]struct{}), 15 } 16 } 17 18 func NewStringSetWithValues(values ...string) StringSet { 19 m := make(map[string]struct{}) 20 21 for _, v := range values { 22 m[v] = struct{}{} 23 } 24 25 return StringSet{set: m} 26 } 27 28 func (v StringSet) Add(s string) { 29 v.set[s] = struct{}{} 30 } 31 32 func (v StringSet) AddAll(s StringSet) { 33 for k, _ := range s.set { 34 v.Add(k) 35 } 36 } 37 38 func (v StringSet) Remove(s string) { 39 delete(v.set, s) 40 } 41 42 func (v StringSet) Contains(s string) bool { 43 _, ok := v.set[s] 44 return ok 45 } 46 47 func (v StringSet) Size() int { 48 return len(v.set) 49 } 50 51 func (v StringSet) Array() []string { 52 values := make([]string, len(v.set)) 53 i := 0 54 for k, _ := range v.set { 55 values[i] = k 56 i += 1 57 } 58 sort.Strings(values) 59 return values 60 } 61 62 func (v StringSet) Intersect(x StringSet) StringSet { 63 n := NewStringSet() 64 for k, _ := range x.set { 65 if v.Contains(k) { 66 n.Add(k) 67 } 68 } 69 return n 70 } 71 72 func (v StringSet) MarshalJSON() ([]byte, error) { 73 return json.Marshal(v.Array()) 74 } 75 76 func (v *StringSet) UnmarshalJSON(data []byte) error { 77 var items []string 78 err := json.Unmarshal(data, &items) 79 if err != nil { 80 return err 81 } 82 83 v.set = make(map[string]struct{}) 84 for _, x := range items { 85 v.set[x] = struct{}{} 86 } 87 return nil 88 }