+ # 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)]
+
+ # Returns the real index for a modulo index.
+ #
+ # ~~~
+ # var a = [10,20,30]
+ # assert a.modulo_index(1) == 1
+ # assert a.modulo_index(3) == 0
+ # assert a.modulo_index(-1) == 2
+ # assert a.modulo_index(-10) == 2
+ # ~~~
+ #
+ # REQUIRE `not_empty`
+ fun modulo_index(index: Int): Int
+ do
+ var length = self.length
+ if index >= 0 then
+ return index % length
+ else
+ return length - (-1 - index) % length - 1
+ end
+ end
+