aboutsummaryrefslogtreecommitdiffstats
path: root/src/rope.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/rope.rs')
-rw-r--r--src/rope.rs37
1 files changed, 1 insertions, 36 deletions
diff --git a/src/rope.rs b/src/rope.rs
index 25da1fc..34c459b 100644
--- a/src/rope.rs
+++ b/src/rope.rs
@@ -142,42 +142,7 @@ impl Rope {
}
pub fn insert(&self, pos: usize, c: u8) -> Rope {
- match self {
- Rope(Node::Leaf(l)) => {
- if self.len() < MAX_NODE_SIZE {
- let mut new_buf = vec![0; self.len() + 1];
- new_buf[..pos].copy_from_slice(&l.bytes()[..pos]);
- new_buf[pos] = c;
- new_buf[pos + 1..].copy_from_slice(&l.bytes()[pos..]);
- return Rope::leaf(new_buf);
- }
- let half = MAX_NODE_SIZE / 2;
- let mut buf_left;
- let mut buf_right;
- if pos <= half {
- buf_left = vec![0; half+1];
- buf_right = vec![0; half];
- buf_left[..pos].copy_from_slice(&l.bytes()[..pos]);
- buf_left[pos] = c;
- buf_left[pos+1..].copy_from_slice(&l.bytes()[pos..half]);
- buf_right.copy_from_slice(&l.bytes()[half..]);
- } else {
- buf_left = vec![0; half];
- buf_right = vec![0; half+1];
- buf_left.copy_from_slice(&l.bytes()[..half]);
- buf_right[..pos-half].copy_from_slice(&l.bytes()[half..pos]);
- buf_right[pos-half] = c;
- buf_right[pos-half+1..].copy_from_slice(&l.bytes()[pos..]);
- }
- return Rope::leaf(buf_left).concat(&Rope::leaf(buf_right));
- }
- Rope(Node::Branch(b)) => {
- if pos < b.left.len() {
- return b.left.insert(pos, c).concat(&b.right);
- }
- return b.left.concat(&b.right.insert(pos - b.left.len(), c));
- }
- }
+ return self.slice(0, pos).concat(&Rope::leaf(vec![c])).concat(&self.slice(pos, self.len()));
}
pub fn open(path: &Path) -> Result<Rope, Box<dyn Error>> {