+ redef fun append_substring_impl(s, from, length) do
+ if length <= 0 then return
+ if not s isa FlatText then
+ super
+ return
+ end
+ var sits = s._items
+ var bytest = s.char_to_byte_index(from)
+ var bytend = s.char_to_byte_index(from + length - 1)
+ var btln = bytend - bytest + sits.char_at(bytend).u8char_len
+ enlarge(btln + _byte_length)
+ sits.copy_to(_items, btln, bytest, _byte_length)
+ _byte_length += btln
+ _length += length
+ end
+
+ redef fun remove_at(p, len) do
+ if len == null then len = 1
+ if len == 0 then return
+ var its = _items
+ var bst = char_to_byte_index(p)
+ var bend = char_to_byte_index(p + len - 1)
+ bend += its.char_at(bend).u8char_len
+ var blen = bend - bst
+ lshift_bytes(bend, bend - bst)
+ byte_length -= blen
+ length -= len
+ end
+