From 046454f8a41c7c3180c7de052f8c508f0398ca9c Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 13 May 2015 10:54:07 -0400 Subject: [PATCH] standard: add `Range::reverse_iterator` Now people can write countdowns. Signed-off-by: Jean Privat --- lib/standard/collection/range.nit | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/lib/standard/collection/range.nit b/lib/standard/collection/range.nit index da68294..1ad0309 100644 --- a/lib/standard/collection/range.nit +++ b/lib/standard/collection/range.nit @@ -49,6 +49,15 @@ class Range[E: Discrete] redef fun iterator do return new IteratorRange[E](self) + # Gets an iterator starting at the end and going backwards + # + # var reviter = [1..4].reverse_iterator + # assert reviter.to_a == [4,3,2,1] + # + # reviter = [1..4[.reverse_iterator + # assert reviter.to_a == [3,2,1] + fun reverse_iterator: Iterator[E] do return new ReverseIteratorRange[E](self) + # assert [1..10].length == 10 # assert [1..10[.length == 9 # assert [1..1].length == 1 @@ -120,22 +129,38 @@ class Range[E: Discrete] end end +# Iterator on ranges. private class IteratorRange[E: Discrete] - # Iterator on ranges. super Iterator[E] var range: Range[E] redef var item is noinit redef fun is_ok do return _item < _range.after - + redef fun next do _item = _item.successor(1) - + init do _item = _range.first end end +# Reverse iterator on ranges. +private class ReverseIteratorRange[E: Discrete] + super Iterator[E] + var range: Range[E] + redef var item is noinit + + redef fun is_ok do return _item >= _range.first + + redef fun next do _item = _item.predecessor(1) + + init + do + _item = _range.last + end +end + redef class Int # Returns the range from 0 to `self-1`, is used to do: # -- 1.7.9.5