Property definitions

core $ Iterator :: defaultinit
# Iterators generate a series of elements, one at a time.
#
# They are mainly used with collections and obtained from `Collection::iterator`.
interface Iterator[E]
	# The current item.
	# Require `is_ok`.
	fun item: E is abstract

	# Jump to the next item.
	# Require `is_ok`.
	fun next is abstract

	# Jump to the next item `step` times.
	#
	# ~~~
	# var i = [11, 22, 33, 44].iterator
	# assert i.item == 11
	# i.next_by 2
	# assert i.item == 33
	# ~~~
	#
	# `next_by` should be used instead of looping on `next` because is takes care
	# of stopping if the end of iteration is reached prematurely whereas a loop of
	# `next` will abort because of the precondition on `is_ok`.
	#
	# ~~~
	# i.next_by 100
	# assert not i.is_ok
	# ~~~
	#
	# If `step` is negative, this method aborts.
	# But specific subclasses can change this and do something more meaningful instead.
	#
	# Require `is_ok`
	fun next_by(step: Int)
	do
		assert step >= 0
		while is_ok and step > 0 do
			next
			step -= 1
		end
	end

	# Is there a current item ?
	fun is_ok: Bool is abstract

	# Iterate over `self`
	fun iterator: Iterator[E] do return self

	# Pre-iteration hook.
	#
	# Used to inform `self` that the iteration is starting.
	# Specific iterators can use this to prepare some resources.
	#
	# Is automatically invoked at the beginning of `for` structures.
	#
	# Do nothing by default.
	fun start do end

	# Post-iteration hook.
	#
	# Used to inform `self` that the iteration is over.
	# Specific iterators can use this to free some resources.
	#
	# Is automatically invoked at the end of `for` structures.
	#
	# Do nothing by default.
	fun finish do end

	# A decorator around `self` that advance self a given number of steps instead of one.
	#
	# ~~~
	# var i = [11, 22, 33, 44, 55].iterator
	# var i2 = i.to_step(2)
	#
	# assert i2.item == 11
	# i2.next
	# assert i2.item == 33
	#
	# assert i.item == 33
	# ~~~
	fun to_step(step: Int): Iterator[E] do return new StepIterator[E](self, step)
end
lib/core/collection/abstract_collection.nit:203,1--285,3