Change summary
crates/editor/src/display_map/patch.rs | 97 +++++++++++++++++----------
1 file changed, 59 insertions(+), 38 deletions(-)
Detailed changes
@@ -8,52 +8,73 @@ struct Patch(Vec<Edit>);
impl Patch {
fn compose(&self, new: &Self) -> Patch {
let mut composed = Vec::new();
- let mut new_edits = new.0.iter().cloned().peekable();
+ let mut old_edits = self.0.iter().cloned().peekable();
let mut old_delta = 0;
let mut new_delta = 0;
- for mut old_edit in self.0.iter().cloned() {
- let old_edit_new_start = old_edit.new.start;
- let old_edit_new_end = old_edit.new.end;
- let mut next_new_delta = new_delta;
- while let Some(mut new_edit) = new_edits.peek().cloned() {
- let new_edit_delta = new_edit.new.len() as i32 - new_edit.old.len() as i32;
- if new_edit.old.end < old_edit_new_start {
- new_edit.old.start = (new_edit.old.start as i32 - old_delta) as u32;
- new_edit.old.end = (new_edit.old.end as i32 - old_delta) as u32;
- new_edits.next();
- new_delta += new_edit_delta;
- next_new_delta += new_edit_delta;
- composed.push(new_edit);
- } else if new_edit.old.start <= old_edit_new_end {
- if new_edit.old.start < old_edit_new_start {
- old_edit.old.start -= old_edit_new_start - new_edit.old.start;
- old_edit.new.start -= old_edit_new_start - new_edit.old.start;
+ for mut new_edit in new.0.iter().cloned() {
+ while let Some(mut old_edit) = old_edits.peek().cloned() {
+ if old_edit.new.end < new_edit.old.start {
+ old_edit.new.start = (old_edit.new.start as i32 + new_delta) as u32;
+ old_edit.new.end = (old_edit.new.end as i32 + new_delta) as u32;
+ old_edits.next();
+ composed.push(old_edit);
+ } else if old_edit.new.start < new_edit.old.end {
+ if old_edit.new.start < new_edit.old.start {
+ new_edit.old.start -= new_edit.old.start - old_edit.new.start;
+ new_edit.new.start -= new_edit.old.start - old_edit.new.start;
}
- if new_edit.old.end > old_edit_new_end {
- old_edit.old.end += new_edit.old.end - old_edit_new_end;
- old_edit.new.end += new_edit.old.end - old_edit_new_end;
+ if old_edit.new.end > new_edit.old.end {
+ new_edit.old.end += old_edit.new.end - new_edit.old.end;
+ new_edit.new.end += old_edit.new.end - new_edit.old.end;
}
-
- old_edit.new.end = (old_edit.new.end as i32 + new_edit_delta) as u32;
- new_edits.next();
- next_new_delta += new_edit_delta;
- } else {
- break;
}
}
-
- old_edit.new.start = (old_edit.new.start as i32 + new_delta) as u32;
- old_edit.new.end = (old_edit.new.end as i32 + new_delta) as u32;
- old_delta += old_edit.new.len() as i32 - old_edit.old.len() as i32;
- new_delta = next_new_delta;
- composed.push(old_edit);
}
- composed.extend(new_edits.map(|mut new_edit| {
- new_edit.old.start = (new_edit.old.start as i32 - old_delta) as u32;
- new_edit.old.end = (new_edit.old.end as i32 - old_delta) as u32;
- new_edit
- }));
+
+ todo!();
+ // for mut old_edit in self.0.iter().cloned() {
+ // let old_edit_new_start = old_edit.new.start;
+ // let old_edit_new_end = old_edit.new.end;
+ // let mut next_new_delta = new_delta;
+ // while let Some(mut new_edit) = new_edits.peek().cloned() {
+ // let new_edit_delta = new_edit.new.len() as i32 - new_edit.old.len() as i32;
+ // if new_edit.old.end < old_edit_new_start {
+ // new_edit.old.start = (new_edit.old.start as i32 - old_delta) as u32;
+ // new_edit.old.end = (new_edit.old.end as i32 - old_delta) as u32;
+ // new_edits.next();
+ // new_delta += new_edit_delta;
+ // next_new_delta += new_edit_delta;
+ // composed.push(new_edit);
+ // } else if new_edit.old.start <= old_edit_new_end {
+ // if new_edit.old.start < old_edit_new_start {
+ // old_edit.old.start -= old_edit_new_start - new_edit.old.start;
+ // old_edit.new.start -= old_edit_new_start - new_edit.old.start;
+ // }
+ // if new_edit.old.end > old_edit_new_end {
+ // old_edit.old.end += new_edit.old.end - old_edit_new_end;
+ // old_edit.new.end += new_edit.old.end - old_edit_new_end;
+ // }
+
+ // old_edit.new.end = (old_edit.new.end as i32 + new_edit_delta) as u32;
+ // new_edits.next();
+ // next_new_delta += new_edit_delta;
+ // } else {
+ // break;
+ // }
+ // }
+
+ // old_edit.new.start = (old_edit.new.start as i32 + new_delta) as u32;
+ // old_edit.new.end = (old_edit.new.end as i32 + new_delta) as u32;
+ // old_delta += old_edit.new.len() as i32 - old_edit.old.len() as i32;
+ // new_delta = next_new_delta;
+ // composed.push(old_edit);
+ // }
+ // composed.extend(new_edits.map(|mut new_edit| {
+ // new_edit.old.start = (new_edit.old.start as i32 - old_delta) as u32;
+ // new_edit.old.end = (new_edit.old.end as i32 - old_delta) as u32;
+ // new_edit
+ // }));
Patch(composed)
}