From 836a9165a54bd6d9feefaf536ff07de969dee699 Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Sat, 30 Mar 2024 06:56:12 +0100 Subject: [PATCH] Added Iterator interface and two implementation: list itrator and range iterator --- it-range.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++ iterator.go | 37 +++++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 it-range.go create mode 100644 iterator.go 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 +}