diff --git a/it-range.go b/it-range.go new file mode 100644 index 0000000..8e2ec52 --- /dev/null +++ b/it-range.go @@ -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 +} diff --git a/iterator.go b/iterator.go new file mode 100644 index 0000000..5954515 --- /dev/null +++ b/iterator.go @@ -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 +}