lib/collection: generalize `reverse?_iterator_from?` to SequenceRead
authorJean Privat <jean@pryen.org>
Fri, 4 Apr 2014 15:29:41 +0000 (11:29 -0400)
committerJean Privat <jean@pryen.org>
Fri, 4 Apr 2014 18:16:09 +0000 (14:16 -0400)
Those services could be useful in all Sequence, not only in StringCharView

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

lib/standard/collection/abstract_collection.nit
lib/standard/string.nit

index 434d26f..ea39ab3 100644 (file)
@@ -631,8 +631,6 @@ interface SequenceRead[E]
                return res
        end
 
-       redef fun iterator: IndexedIterator[E] is abstract
-
        # Two sequences are equals if they have the same items in the same order.
        #
        #     var a = new List[Int]
@@ -661,6 +659,42 @@ interface SequenceRead[E]
                for e in self do res += res.hash
                return res
        end
+
+       redef fun iterator: IndexedIterator[E] is abstract
+
+       # Gets a new Iterator starting at position `pos`
+       #
+       #     var iter = [10,20,30,40,50].iterator_from(2)
+       #     assert iter.to_a == [30, 40, 50]
+       fun iterator_from(pos: Int): IndexedIterator[E]
+       do
+               var res = iterator
+               while pos > 0 and res.is_ok do
+                       res.next
+                       pos -= 1
+               end
+               return res
+       end
+
+       # Gets an iterator starting at the end and going backwards
+       #
+       #     var reviter = [1,2,3].reverse_iterator
+       #     assert reviter.to_a == [3,2,1]
+       fun reverse_iterator: IndexedIterator[E] is abstract
+
+       # Gets an iterator on the chars of self starting from `pos`
+       #
+       #     var reviter = [10,20,30,40,50].reverse_iterator_from(2)
+       #     assert reviter.to_a == [30,20,10]
+       fun reverse_iterator_from(pos: Int): IndexedIterator[E]
+       do
+               var res = reverse_iterator
+               while pos > 0 and res.is_ok do
+                       res.next
+                       pos -= 1
+               end
+               return res
+       end
 end
 
 # Sequence are indexed collection.
index c70ce84..c685f92 100644 (file)
@@ -592,23 +592,7 @@ abstract class StringCharView
 
        redef fun iterator: IndexedIterator[Char] do return self.iterator_from(0)
 
-       # Gets a new Iterator starting at position `pos`
-       #
-       #     var iter = "abcd".chars.iterator_from(2)
-       #     assert iter.to_a == ['c', 'd']
-       fun iterator_from(pos: Int): IndexedIterator[Char] is abstract
-
-       # Gets an iterator starting at the end and going backwards
-       #
-       #     var reviter = "hello".chars.reverse_iterator
-       #     assert reviter.to_a == ['o', 'l', 'l', 'e', 'h']
-       fun reverse_iterator: IndexedIterator[Char] do return self.reverse_iterator_from(self.length - 1)
-
-       # Gets an iterator on the chars of self starting from `pos`
-       #
-       #     var reviter = "hello".chars.reverse_iterator_from(2)
-       #     assert reviter.to_a == ['l', 'e', 'h']
-       fun reverse_iterator_from(pos: Int): IndexedIterator[Char] is abstract
+       redef fun reverse_iterator do return self.reverse_iterator_from(self.length - 1)
 end
 
 # View on Buffer objects, extends Sequence