Fix overlapping (insert | delete) compose

This commit is contained in:
Blaž Hrastnik 2020-10-14 11:46:13 +09:00
parent 94f9603c74
commit 7fcc6f8f1b

View file

@ -109,9 +109,7 @@ pub fn compose(self, other: ChangeSet) -> Result<Self, ()> {
Ordering::Greater => {
// figure out the byte index of the truncated string end
let (pos, _) = s.char_indices().nth(len - j).unwrap();
// calculate the difference
let to_drop = s.len() - pos;
s.pop_back(u32::try_from(to_drop).unwrap());
s.pop_front(s.len() as u32 - pos as u32);
head_a = Some(Insert(s));
head_b = changes_b.next();
}
@ -487,7 +485,7 @@ fn composition() {
let a = ChangeSet {
changes: vec![
Retain(5),
Insert("!".into()),
Insert(" test!".into()),
Retain(1),
Delete(2),
Insert("abc".into()),
@ -496,8 +494,8 @@ fn composition() {
};
let b = ChangeSet {
changes: vec![Delete(5), Insert("world".into()), Retain(5)],
len: 9,
changes: vec![Delete(10), Insert("world".into()), Retain(5)],
len: 15,
};
let mut text = Rope::from("hello xz");