1package bug
2
3type OperationIterator struct {
4 bug *Bug
5 packIndex int
6 opIndex int
7}
8
9func NewOperationIterator(bug *Bug) *OperationIterator {
10 return &OperationIterator{
11 bug: bug,
12 packIndex: 0,
13 opIndex: -1,
14 }
15}
16
17func (it *OperationIterator) Next() bool {
18 // Special case of the staging area
19 if it.packIndex == len(it.bug.Packs)+1 {
20 pack := it.bug.Staging
21 it.opIndex++
22 return it.opIndex < len(pack.Operations)
23 }
24
25 if it.packIndex >= len(it.bug.Packs) {
26 return false
27 }
28
29 pack := it.bug.Packs[it.packIndex]
30
31 it.opIndex++
32
33 if it.opIndex < len(pack.Operations) {
34 return true
35 }
36
37 // Note: this iterator doesn't handle the empty pack case
38 it.opIndex = 0
39 it.packIndex++
40
41 // Special case of the non-empty staging area
42 if it.packIndex == len(it.bug.Packs)+1 && len(it.bug.Staging.Operations) > 0 {
43 return true
44 }
45
46 return it.packIndex < len(it.bug.Packs)
47}
48
49func (it *OperationIterator) Value() Operation {
50 // Special case of the staging area
51 if it.packIndex == len(it.bug.Packs)+1 {
52 pack := it.bug.Staging
53
54 if it.opIndex >= len(pack.Operations) {
55 panic("Iterator is not valid anymore")
56 }
57
58 return pack.Operations[it.opIndex]
59 }
60
61 if it.packIndex >= len(it.bug.Packs) {
62 panic("Iterator is not valid anymore")
63 }
64
65 pack := it.bug.Packs[it.packIndex]
66
67 if it.opIndex >= len(pack.Operations) {
68 panic("Iterator is not valid anymore")
69 }
70
71 return pack.Operations[it.opIndex]
72}