56 lines
1.0 KiB
Go
56 lines
1.0 KiB
Go
|
// 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
|
||
|
}
|