47 lines
1.3 KiB
GDScript
47 lines
1.3 KiB
GDScript
class_name RangeIterator extends Iterator
|
|
|
|
var index: int
|
|
var range: IntRange
|
|
var step: int
|
|
var descending: bool
|
|
var _done: bool = false
|
|
|
|
func _init(range: IntRange, start_index: int = range.min, step: int = 1) -> void:
|
|
assert(step != 0, "step cannot be zero")
|
|
|
|
self.range = range
|
|
self.index = start_index
|
|
self.step = step
|
|
self.descending = step < 0
|
|
|
|
func from_values(from: int, to: int, start_index: int = range.min, step: int = 1) -> RangeIterator:
|
|
return RangeIterator.new(IntRange.new(from, to), start_index, step)
|
|
|
|
static func from_sized(value: Variant) -> Result:
|
|
match IntRange.from_sized(value):
|
|
var range when range.is_ok():
|
|
return Result.ok(RangeIterator.new(range.unwrap()))
|
|
var e: return e
|
|
|
|
static func from_array(array: Array) -> RangeIterator:
|
|
return RangeIterator.from_sized(array).unwrap()
|
|
|
|
func size() -> int:
|
|
return range.size()
|
|
|
|
func length() -> int:
|
|
return range.length()
|
|
|
|
func clone() -> RangeIterator:
|
|
return RangeIterator.new(range, index)
|
|
|
|
func next() -> Option:
|
|
if _done: return Option.none
|
|
if index == range.max or not range.contains(index):
|
|
_done = true
|
|
if range.inclusive: return Option.some(index)
|
|
else: return Option.none
|
|
|
|
var current_value = Option.some(index)
|
|
index += step
|
|
return current_value
|