forked from peco/peco
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathselection.go
59 lines (50 loc) · 1.1 KB
/
selection.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
package peco
import (
"github.com/google/btree"
"github.com/peco/peco/line"
)
// NewSelection creates a new empty Selection
func NewSelection() *Selection {
s := &Selection{}
s.Reset()
return s
}
// Add adds a new line to the selection. If the line already
// exists in the selection, it is silently ignored
func (s *Selection) Add(l line.Line) {
s.mutex.Lock()
defer s.mutex.Unlock()
s.tree.ReplaceOrInsert(l)
}
func (s *Selection) Copy(dst *Selection) {
s.Ascend(func(it btree.Item) bool {
dst.Add(it.(line.Line))
return true
})
}
// Remove removes the specified line from the selection
func (s *Selection) Remove(l line.Line) {
s.mutex.Lock()
defer s.mutex.Unlock()
s.tree.Delete(l)
}
func (s *Selection) Reset() {
s.mutex.Lock()
defer s.mutex.Unlock()
s.tree = btree.New(32)
}
func (s *Selection) Has(x line.Line) bool {
s.mutex.Lock()
defer s.mutex.Unlock()
return s.tree.Has(x)
}
func (s *Selection) Len() int {
s.mutex.Lock()
defer s.mutex.Unlock()
return s.tree.Len()
}
func (s *Selection) Ascend(i btree.ItemIterator) {
s.mutex.Lock()
defer s.mutex.Unlock()
s.tree.Ascend(i)
}