def slice(*args)
if args.size == 2
index, len = *args
endex = index+len
new_text = text[index, len]
new_marks = []
marks.each do |(i, v)|
new_marks << [i, v] if i >= index && i < endex
end
self.class.new(new_text, new_marks)
elsif args.size == 1
rng = args.first
case rng
when Range
index, endex = rng.begin, rng.end
new_text = text[rng]
new_marks = []
marks.each do |(i, v)|
new_marks << [i, v] if i >= index && i < endex
end
self.class.new(new_text, new_marks)
else
nm = marks.select do |(i, v)|
i == rng or ( i == rng + 1 && [:clear, :reset].include?(v) )
end
self.class.new(text[rng,1], nm)
end
else
raise ArgumentError
end
end