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  }