...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package attribute
16
17
18
19 type Iterator struct {
20 storage *Set
21 idx int
22 }
23
24
25
26
27 type MergeIterator struct {
28 one oneIterator
29 two oneIterator
30 current KeyValue
31 }
32
33 type oneIterator struct {
34 iter Iterator
35 done bool
36 attr KeyValue
37 }
38
39
40
41 func (i *Iterator) Next() bool {
42 i.idx++
43 return i.idx < i.Len()
44 }
45
46
47
48
49
50 func (i *Iterator) Label() KeyValue {
51 return i.Attribute()
52 }
53
54
55
56 func (i *Iterator) Attribute() KeyValue {
57 kv, _ := i.storage.Get(i.idx)
58 return kv
59 }
60
61
62
63
64
65 func (i *Iterator) IndexedLabel() (int, KeyValue) {
66 return i.idx, i.Attribute()
67 }
68
69
70
71 func (i *Iterator) IndexedAttribute() (int, KeyValue) {
72 return i.idx, i.Attribute()
73 }
74
75
76 func (i *Iterator) Len() int {
77 return i.storage.Len()
78 }
79
80
81
82
83 func (i *Iterator) ToSlice() []KeyValue {
84 l := i.Len()
85 if l == 0 {
86 return nil
87 }
88 i.idx = -1
89 slice := make([]KeyValue, 0, l)
90 for i.Next() {
91 slice = append(slice, i.Attribute())
92 }
93 return slice
94 }
95
96
97
98 func NewMergeIterator(s1, s2 *Set) MergeIterator {
99 mi := MergeIterator{
100 one: makeOne(s1.Iter()),
101 two: makeOne(s2.Iter()),
102 }
103 return mi
104 }
105
106 func makeOne(iter Iterator) oneIterator {
107 oi := oneIterator{
108 iter: iter,
109 }
110 oi.advance()
111 return oi
112 }
113
114 func (oi *oneIterator) advance() {
115 if oi.done = !oi.iter.Next(); !oi.done {
116 oi.attr = oi.iter.Attribute()
117 }
118 }
119
120
121 func (m *MergeIterator) Next() bool {
122 if m.one.done && m.two.done {
123 return false
124 }
125 if m.one.done {
126 m.current = m.two.attr
127 m.two.advance()
128 return true
129 }
130 if m.two.done {
131 m.current = m.one.attr
132 m.one.advance()
133 return true
134 }
135 if m.one.attr.Key == m.two.attr.Key {
136 m.current = m.one.attr
137 m.one.advance()
138 m.two.advance()
139 return true
140 }
141 if m.one.attr.Key < m.two.attr.Key {
142 m.current = m.one.attr
143 m.one.advance()
144 return true
145 }
146 m.current = m.two.attr
147 m.two.advance()
148 return true
149 }
150
151
152
153
154 func (m *MergeIterator) Label() KeyValue {
155 return m.current
156 }
157
158
159 func (m *MergeIterator) Attribute() KeyValue {
160 return m.current
161 }
162
View as plain text