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