diff options
Diffstat (limited to '')
-rw-r--r-- | ui/util.go | 80 |
1 files changed, 80 insertions, 0 deletions
@@ -12,6 +12,86 @@ import ( "github.com/lxn/walk" ) +type orderedStringSet struct { + items []string + item2index map[string]int +} + +func orderedStringSetFromSlice(items []string) *orderedStringSet { + oss := newOrderedStringSet() + oss.AddMany(items) + return oss +} + +func newOrderedStringSet() *orderedStringSet { + return &orderedStringSet{item2index: make(map[string]int)} +} + +func (oss *orderedStringSet) Add(item string) bool { + if _, ok := oss.item2index[item]; ok { + return false + } + + oss.item2index[item] = len(oss.items) + oss.items = append(oss.items, item) + return true +} + +func (oss *orderedStringSet) AddMany(items []string) { + for _, item := range items { + oss.Add(item) + } +} + +func (oss *orderedStringSet) UniteWith(other *orderedStringSet) { + if other == oss { + return + } + + oss.AddMany(other.items) +} + +func (oss *orderedStringSet) Remove(item string) bool { + if i, ok := oss.item2index[item]; ok { + oss.items = append(oss.items[:i], oss.items[i+1:]...) + delete(oss.item2index, item) + return true + } + + return false +} + +func (oss *orderedStringSet) Len() int { + return len(oss.items) +} + +func (oss *orderedStringSet) ToSlice() []string { + return append(([]string)(nil), oss.items...) +} + +func (oss *orderedStringSet) Contains(item string) bool { + _, ok := oss.item2index[item] + return ok +} + +func (oss *orderedStringSet) IsSupersetOf(other *orderedStringSet) bool { + if oss.Len() < other.Len() { + return false + } + + for _, item := range other.items { + if !oss.Contains(item) { + return false + } + } + + return true +} + +func (oss *orderedStringSet) String() string { + return fmt.Sprintf("%v", oss.items) +} + func writeFileWithOverwriteHandling(owner walk.Form, filePath string, write func(file *os.File) error) bool { showError := func(err error) bool { if err == nil { |