aboutsummaryrefslogtreecommitdiffstats
path: root/src/rope.rs
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2024-01-06 15:17:49 -0800
committerRose Hogenson <rosehogenson@posteo.net>2024-01-06 15:17:49 -0800
commitfb6c02e033196cdc8d2a3642ea8e869d18b37fed (patch)
treebafe64869f0fb98c55965976a3048a732bb8d3fc /src/rope.rs
parent9ac429aa26529af2f753d01fe6e4fe5046bdf30f (diff)
downloadeditor-fb6c02e033196cdc8d2a3642ea8e869d18b37fed.tar.zst
Fix some bugs with long lines.
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>> {