mirror of
https://github.com/MichaelMure/git-bug.git
synced 2024-12-14 17:51:44 +03:00
73 lines
1.4 KiB
Go
73 lines
1.4 KiB
Go
package bug
|
|
|
|
type OperationIterator struct {
|
|
bug *Bug
|
|
packIndex int
|
|
opIndex int
|
|
}
|
|
|
|
func NewOperationIterator(bug Interface) *OperationIterator {
|
|
return &OperationIterator{
|
|
bug: bugFromInterface(bug),
|
|
packIndex: 0,
|
|
opIndex: -1,
|
|
}
|
|
}
|
|
|
|
func (it *OperationIterator) Next() bool {
|
|
// Special case of the staging area
|
|
if it.packIndex == len(it.bug.packs) {
|
|
pack := it.bug.staging
|
|
it.opIndex++
|
|
return it.opIndex < len(pack.Operations)
|
|
}
|
|
|
|
if it.packIndex >= len(it.bug.packs) {
|
|
return false
|
|
}
|
|
|
|
pack := it.bug.packs[it.packIndex]
|
|
|
|
it.opIndex++
|
|
|
|
if it.opIndex < len(pack.Operations) {
|
|
return true
|
|
}
|
|
|
|
// Note: this iterator doesn't handle the empty pack case
|
|
it.opIndex = 0
|
|
it.packIndex++
|
|
|
|
// Special case of the non-empty staging area
|
|
if it.packIndex == len(it.bug.packs) && len(it.bug.staging.Operations) > 0 {
|
|
return true
|
|
}
|
|
|
|
return it.packIndex < len(it.bug.packs)
|
|
}
|
|
|
|
func (it *OperationIterator) Value() Operation {
|
|
// Special case of the staging area
|
|
if it.packIndex == len(it.bug.packs) {
|
|
pack := it.bug.staging
|
|
|
|
if it.opIndex >= len(pack.Operations) {
|
|
panic("Iterator is not valid anymore")
|
|
}
|
|
|
|
return pack.Operations[it.opIndex]
|
|
}
|
|
|
|
if it.packIndex >= len(it.bug.packs) {
|
|
panic("Iterator is not valid anymore")
|
|
}
|
|
|
|
pack := it.bug.packs[it.packIndex]
|
|
|
|
if it.opIndex >= len(pack.Operations) {
|
|
panic("Iterator is not valid anymore")
|
|
}
|
|
|
|
return pack.Operations[it.opIndex]
|
|
}
|