standard: add `Range::reverse_iterator`
authorJean Privat <jean@pryen.org>
Wed, 13 May 2015 14:54:07 +0000 (10:54 -0400)
committerJean Privat <jean@pryen.org>
Wed, 13 May 2015 14:54:07 +0000 (10:54 -0400)
Now people can write countdowns.

Signed-off-by: Jean Privat <jean@pryen.org>

lib/standard/collection/range.nit

index da68294..1ad0309 100644 (file)
@@ -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:
        #