Return the index-th element but wrap

Whereas self[] requires the index to exists, the modulo accessor automatically wraps overbound and underbouds indexes.

var a = [10,20,30]
assert a.modulo(1) == 20
assert a.modulo(3) == 10
assert a.modulo(-1) == 30
assert a.modulo(-10) == 30

REQUIRE not_empty

ENSURE result == self[modulo_index(index)]

Property definitions

core $ SequenceRead :: modulo
	# Return the index-th element but wrap
	#
	# Whereas `self[]` requires the index to exists, the `modulo` accessor automatically
	# wraps overbound and underbouds indexes.
	#
	# ~~~
	# var a = [10,20,30]
	# assert a.modulo(1) == 20
	# assert a.modulo(3) == 10
	# assert a.modulo(-1) == 30
	# assert a.modulo(-10) == 30
	# ~~~
	#
	# REQUIRE `not_empty`
	# ENSURE `result == self[modulo_index(index)]`
	fun modulo(index: Int): E do return self[modulo_index(index)]
lib/core/collection/abstract_collection.nit:864,2--879,62