aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/ui/util.go
diff options
context:
space:
mode:
Diffstat (limited to 'ui/util.go')
-rw-r--r--ui/util.go80
1 files changed, 80 insertions, 0 deletions
diff --git a/ui/util.go b/ui/util.go
index b17f106c..0cca0909 100644
--- a/ui/util.go
+++ b/ui/util.go
@@ -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 {