@@ -142,7 +142,9 @@ impl BlockMap {
for edit in edits {
let old_start = WrapPoint::new(edit.old.start, 0);
- new_transforms.push_tree(cursor.slice(&old_start, Bias::Left, &()), &());
+ if old_start > *cursor.start() {
+ new_transforms.push_tree(cursor.slice(&old_start, Bias::Left, &()), &());
+ }
let overshoot = old_start.0 - cursor.start().0;
if !overshoot.is_zero() {
@@ -151,138 +153,69 @@ impl BlockMap {
let old_end = WrapPoint::new(edit.old.end, 0);
cursor.seek(&old_end, Bias::Left, &());
+ cursor.next(&());
+
+ let start_anchor = buffer.anchor_before(Point::new(edit.new.start, 0));
+ let start_block_ix = match self.blocks[last_block_ix..].binary_search_by(|probe| {
+ probe
+ .position
+ .cmp(&start_anchor, buffer)
+ .unwrap()
+ .then(Ordering::Greater)
+ }) {
+ Ok(ix) | Err(ix) => last_block_ix + ix,
+ };
+ let end_block_ix = if edit.new.end > wrap_snapshot.max_point().row() {
+ self.blocks.len()
+ } else {
+ let end_anchor = buffer.anchor_before(Point::new(edit.new.end, 0));
+ match self.blocks[start_block_ix..].binary_search_by(|probe| {
+ probe
+ .position
+ .cmp(&end_anchor, buffer)
+ .unwrap()
+ .then(Ordering::Greater)
+ }) {
+ Ok(ix) | Err(ix) => start_block_ix + ix,
+ }
+ };
+ last_block_ix = end_block_ix;
+
+ blocks_in_edit.clear();
+ blocks_in_edit.extend(
+ self.blocks[start_block_ix..end_block_ix]
+ .iter()
+ .map(|block| (block.position.to_point(buffer).row, block)),
+ );
+ blocks_in_edit.sort_unstable_by_key(|(row, block)| (*row, block.disposition, block.id));
+
+ for (block_row, block) in blocks_in_edit.iter().copied() {
+ let new_transforms_end = new_transforms.summary().input;
+ if block.disposition.is_above() {
+ if block_row > new_transforms_end.row {
+ new_transforms.push(
+ Transform::isomorphic(Point::new(block_row, 0) - new_transforms_end),
+ &(),
+ );
+ }
+ } else {
+ if block_row >= new_transforms_end.row {
+ new_transforms.push(
+ Transform::isomorphic(
+ Point::new(block_row, wrap_snapshot.line_len(block_row))
+ - new_transforms_end,
+ ),
+ &(),
+ );
+ }
+ }
+
+ new_transforms.push(Transform::block(block.clone()), &());
+ }
}
- // while let Some(mut edit) = edits.next() {
- // new_transforms.push_tree(
- // cursor.slice(&WrapPoint::new(edit.old.start, 0), Bias::Left, &()),
- // &(),
- // );
-
- // let mut transform_start_row = cursor.start().row();
- // if cursor.prev_item().map_or(false, |t| {
- // t.block_disposition() == Some(BlockDisposition::Below)
- // }) {
- // transform_start_row += 1;
- // }
- // dbg!("collapsed edit", &edit);
- // edit.new.start -= edit.old.start - transform_start_row;
- // edit.old.start = transform_start_row;
- // let mut edit_follows_below_block = false;
-
- // loop {
- // if edit.old.end > cursor.start().0.row {
- // cursor.seek(&WrapPoint::new(edit.old.end, 0), Bias::Left, &());
- // // dbg!(cursor.start(), cursor.item());
- // if cursor.item().map_or(false, |t| t.is_isomorphic()) {
- // if let Some(prev_transform) = cursor.prev_item() {
- // if prev_transform.block_disposition() == Some(BlockDisposition::Below)
- // && edit.old.end == cursor.start().row() + 1
- // {
- // edit_follows_below_block = true;
- // } else {
- // edit_follows_below_block = false;
- // cursor.next(&());
- // }
- // } else {
- // edit_follows_below_block = false;
- // cursor.next(&());
- // }
- // }
-
- // let transform_end_row = cursor.start().row() + 1;
- // cursor.seek(&WrapPoint::new(transform_end_row, 0), Bias::Left, &());
- // edit.new.end += transform_end_row - edit.old.end;
- // edit.old.end = transform_end_row;
- // }
-
- // if let Some(next_edit) = edits.peek() {
- // if edit.old.end >= next_edit.old.start {
- // let delta = next_edit.new.len() as i32 - next_edit.old.len() as i32;
- // edit.old.end = cmp::max(next_edit.old.end, edit.old.end);
- // edit.new.end = (edit.new.end as i32 + delta) as u32;
- // edits.next();
- // } else {
- // break;
- // }
- // } else {
- // break;
- // }
- // }
-
- // dbg!("expanded edit", &edit);
- // let start_anchor = buffer.anchor_before(Point::new(edit.new.start, 0));
- // let start_block_ix = match self.blocks[last_block_ix..].binary_search_by(|probe| {
- // probe
- // .position
- // .cmp(&start_anchor, buffer)
- // .unwrap()
- // .then(Ordering::Greater)
- // }) {
- // Ok(ix) | Err(ix) => last_block_ix + ix,
- // };
- // let end_block_ix = if edit.new.end > wrap_snapshot.max_point().row() {
- // self.blocks.len()
- // } else {
- // let end_anchor = buffer.anchor_before(Point::new(edit.new.end, 0));
- // match self.blocks[start_block_ix..].binary_search_by(|probe| {
- // probe
- // .position
- // .cmp(&end_anchor, buffer)
- // .unwrap()
- // .then(Ordering::Greater)
- // }) {
- // Ok(ix) | Err(ix) => start_block_ix + ix,
- // }
- // };
- // last_block_ix = end_block_ix;
-
- // blocks_in_edit.clear();
- // blocks_in_edit.extend(
- // self.blocks[start_block_ix..end_block_ix]
- // .iter()
- // .map(|block| (block.position.to_point(buffer).row, block)),
- // );
- // blocks_in_edit.sort_unstable_by_key(|(row, block)| (*row, block.disposition, block.id));
- // // dbg!(&blocks_in_edit);
-
- // for (block_row, block) in blocks_in_edit.iter().copied() {
- // let new_transforms_end = new_transforms.summary().input;
- // if block.disposition.is_above() {
- // if block_row > new_transforms_end.row {
- // new_transforms.push(
- // Transform::isomorphic(Point::new(block_row, 0) - new_transforms_end),
- // &(),
- // );
- // }
- // } else {
- // if block_row >= new_transforms_end.row {
- // new_transforms.push(
- // Transform::isomorphic(
- // Point::new(block_row, wrap_snapshot.line_len(block_row))
- // - new_transforms_end,
- // ),
- // &(),
- // );
- // }
- // }
-
- // new_transforms.push(Transform::block(block.clone()), &());
- // }
-
- // if !edit_follows_below_block {
- // let new_transforms_end = new_transforms.summary().input;
- // let edit_new_end_point =
- // cmp::min(Point::new(edit.new.end, 0), wrap_snapshot.max_point().0);
- // if new_transforms_end < edit_new_end_point {
- // new_transforms.push(
- // Transform::isomorphic(edit_new_end_point - new_transforms_end),
- // &(),
- // );
- // }
- // }
- // }
new_transforms.push_tree(cursor.suffix(&()), &());
+
drop(cursor);
*transforms = new_transforms;
}