aboutsummaryrefslogtreecommitdiffstats
path: root/src/rope.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/rope.rs')
-rw-r--r--src/rope.rs19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/rope.rs b/src/rope.rs
index 31c3296..737d949 100644
--- a/src/rope.rs
+++ b/src/rope.rs
@@ -355,4 +355,23 @@ impl Rope {
}
}
}
+
+ pub fn byte(&self, i: usize) -> u8 {
+ if i >= self.len() {
+ panic!("Index {} out of range 0..{}", i, self.len());
+ }
+ match self {
+ Rope(Node::Leaf(l)) => l.bytes()[i],
+ Rope(Node::Branch(b)) => {
+ let mut i = i;
+ for c in b.children().iter() {
+ if i < c.len() {
+ return c.byte(i);
+ }
+ i -= c.len();
+ }
+ panic!("unreachable");
+ }
+ }
+ }
}