Added Iterator interface and two implementation: list itrator and range iterator

This commit is contained in:
Celestino Amoroso 2024-03-30 06:56:12 +01:00
parent e012afa691
commit 836a9165a5
2 changed files with 92 additions and 0 deletions

55
it-range.go Normal file
View File

@ -0,0 +1,55 @@
// it-range.go
package expr
import "io"
type RangeIterator struct {
start int64
end int64
step int64
current int64
index int
}
func NewRangeIterator(start, end, step int64) *RangeIterator {
if step == 0 {
panic("Range step must be not zero")
}
if step < 0 && start < end {
panic("When the range's step is less than zero, start must be greater than end")
}
if step > 0 && start > end {
panic("When the range's step is greater than zero, start must be less than end")
}
return &RangeIterator{start: start, end: end, step: step, current: start, index: 0}
}
func (it *RangeIterator) Reset() {
it.index = 0
it.current = it.start
}
func (it *RangeIterator) Next() (item any, err error) {
if it.step > 0 {
if it.current < it.end {
item = it.current
it.current += it.step
it.index++
} else {
err = io.EOF
}
} else {
if it.current > it.end {
item = it.current
it.current += it.step
it.index++
} else {
err = io.EOF
}
}
return
}
func (it *RangeIterator) Index() int {
return it.index - 1
}

37
iterator.go Normal file
View File

@ -0,0 +1,37 @@
// iterator.go
package expr
import "io"
type Iterator interface {
Reset()
Next() (item any, err error) // must return io.EOF after the last item
Index() int
}
type FlatArrayIterator struct {
a []any
index int
}
func NewFlatArrayIterator(array []any) *FlatArrayIterator {
return &FlatArrayIterator{a: array, index: 0}
}
func (it *FlatArrayIterator) Reset() {
it.index = 0
}
func (it *FlatArrayIterator) Next() (item any, err error) {
if it.index < len(it.a) {
item = it.a[it.index]
it.index++
} else {
err = io.EOF
}
return
}
func (it *FlatArrayIterator) Index() int {
return it.index - 1
}