signalis-eb/godot/addons/iterator/bounded_range.gd

29 lines
827 B
GDScript

class_name BoundedRangeIterator extends Iterator
var range: IntRange
var bounds: IntRange
var step: int
var limit: int
var index: int
func _init(range: IntRange, bounds: IntRange, step: int = 1, limit: int = 1, start_index: int = range.min) -> void:
self.range = range
self.bounds = bounds
self.step = step
self.limit = limit
self.index = start_index
func clone() -> BoundedRangeIterator:
return BoundedRangeIterator.new(range, bounds, step, limit, index)
func next() -> Option:
if bounds.contains(index):
var current_value = Option.some(index)
index += step
return current_value
elif limit > 0:
limit -= 1
var current_value = bounds.wrap(index)
index = current_value + 1
return Option.some(current_value)
else: return Option.none