tests: fix base_inline
[nit.git] / lib / standard / ropes.nit
index b1aad2e..45c1cbd 100644 (file)
@@ -121,7 +121,7 @@ abstract class Rope
        private fun leaves(from: Int): LeavesIterator do return new LeavesIterator(self, from)
 
        # Iterator on the substrings from 0, in forward order
-       fun substrings: IndexedIterator[Text] do return new SubstringsIterator(self, 0)
+       redef fun substrings do return new SubstringsIterator(self, 0)
 
        # Iterator on the substrings, starting at position `from`, in forward order
        fun substrings_from(from: Int): IndexedIterator[Text] do return new SubstringsIterator(self, from)
@@ -224,6 +224,8 @@ class RopeString
 
        redef fun empty do return once new RopeString.from("")
 
+       redef var chars: SequenceRead[Char] = new RopeStringChars(self)
+
        redef fun reversed
        do
                var ret = empty.as(RopeString)
@@ -263,7 +265,7 @@ class RopeString
        end
 
        # Inserts a String `str` at position `pos`
-       fun insert_at(str: String, pos: Int): RopeString
+       redef fun insert_at(str, pos)
        do
                if str.length == 0 then return self
                if self.length == 0 then return new RopeString.from(str)
@@ -287,8 +289,8 @@ class RopeString
                        var l_half = s.substring(0, s.length - path.offset)
                        var r_half = s.substring_from(s.length - path.offset)
                        var cct = new Concat
-                       cct.right = new Leaf(r_half)
-                       last_concat.left = new Leaf(l_half)
+                       cct.right = new Leaf(r_half.as(FlatString))
+                       last_concat.left = new Leaf(l_half.as(FlatString))
                        if str isa FlatString then last_concat.right = new Leaf(str) else last_concat.right = str.as(RopeString).root
                        cct.left = last_concat
                        last_concat = cct
@@ -310,10 +312,10 @@ class RopeString
        end
 
        # Adds `s` at the beginning of self
-       fun prepend(s: String): String do return insert_at(s, 0)
+       redef fun prepend(s) do return insert_at(s, 0)
 
        # Adds `s` at the end of self
-       fun append(s: String): String
+       redef fun append(s)
        do
                if self.is_empty then return s
                return new RopeString.from_root(append_to_path(root,s))
@@ -362,7 +364,7 @@ class RopeString
                var lf = path.leaf
                var offset = path.offset
 
-               if path.leaf.str.length - offset > len then lf = new Leaf(lf.str.substring(offset,len)) else lf = new Leaf(lf.str.substring_from(offset))
+               if path.leaf.str.length - offset > len then lf = new Leaf(lf.str.substring(offset,len).as(FlatString)) else lf = new Leaf(lf.str.substring_from(offset).as(FlatString))
 
                var nod: RopeNode = lf
 
@@ -381,7 +383,7 @@ class RopeString
                path = ret.node_at(len-1)
 
                offset = path.offset
-               nod = new Leaf(path.leaf.str.substring(0, offset+1))
+               nod = new Leaf(path.leaf.str.substring(0, offset+1).as(FlatString))
 
                for i in path.stack.reverse_iterator do
                        if i.left then continue
@@ -398,6 +400,47 @@ class RopeString
        end
 end
 
+redef class FlatString
+
+       redef fun append(s) do return (new RopeString.from(self)) + s
+
+       redef fun prepend(s) do return (new RopeString.from(self)).prepend(s)
+
+       redef fun insert_at(s, pos)
+       do
+               if pos == 0 then return prepend(s)
+               if pos == length then return append(s)
+
+               var l = substring(0,pos)
+               var r = substring_from(pos)
+               var ret: String = new RopeString.from(l)
+               ret += s
+               return ret + r
+       end
+
+end
+
+private class RopeStringChars
+       super SequenceRead[Char]
+
+       var tgt: Rope
+
+       redef fun [](pos)
+       do
+               assert pos < tgt.length
+               var path = tgt.node_at(pos)
+               return path.leaf.str.chars[path.offset]
+       end
+
+       redef fun iterator do return iterator_from(0)
+
+       redef fun iterator_from(pos) do return new RopeCharIterator(tgt, pos)
+
+       redef fun reverse_iterator do return reverse_iterator_from(tgt.length-1)
+
+       redef fun reverse_iterator_from(pos) do return new ReverseRopeCharIterator(tgt, pos)
+end
+
 # Used to iterate on a Rope
 private class IteratorElement