WIP
This commit is contained in:
parent
34f85b5690
commit
131979dff0
2 changed files with 62 additions and 56 deletions
|
@ -14,14 +14,14 @@ impl<T: Rng> Iterator for RandomCharIter<T> {
|
||||||
fn next(&mut self) -> Option<Self::Item> {
|
fn next(&mut self) -> Option<Self::Item> {
|
||||||
match self.0.gen_range(0..100) {
|
match self.0.gen_range(0..100) {
|
||||||
// whitespace
|
// whitespace
|
||||||
0..=19 => [' ', '\n', '\t'].choose(&mut self.0).copied(),
|
0..=4 => ['\n'].choose(&mut self.0).copied(),
|
||||||
// two-byte greek letters
|
// // two-byte greek letters
|
||||||
20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))),
|
// 20..=32 => char::from_u32(self.0.gen_range(('α' as u32)..('ω' as u32 + 1))),
|
||||||
// three-byte characters
|
// // three-byte characters
|
||||||
33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(),
|
// 33..=45 => ['✋', '✅', '❌', '❎', '⭐'].choose(&mut self.0).copied(),
|
||||||
// four-byte characters
|
// // four-byte characters
|
||||||
46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(),
|
// 46..=58 => ['🍐', '🏀', '🍗', '🎉'].choose(&mut self.0).copied(),
|
||||||
// ascii letters
|
// // ascii letters
|
||||||
_ => Some(self.0.gen_range(b'a'..b'z' + 1).into()),
|
_ => Some(self.0.gen_range(b'a'..b'z' + 1).into()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,18 +156,24 @@ impl BlockMap {
|
||||||
dbg!("collapsed edit", &edit);
|
dbg!("collapsed edit", &edit);
|
||||||
edit.new.start -= edit.old.start - transform_start_row;
|
edit.new.start -= edit.old.start - transform_start_row;
|
||||||
edit.old.start = transform_start_row;
|
edit.old.start = transform_start_row;
|
||||||
|
let mut edit_follows_below_block = false;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
if edit.old.end > cursor.start().0.row {
|
if edit.old.end > cursor.start().0.row {
|
||||||
cursor.seek(&WrapPoint::new(edit.old.end, 0), Bias::Left, &());
|
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 cursor.item().map_or(false, |t| t.is_isomorphic()) {
|
||||||
if let Some(prev_transform) = cursor.prev_item() {
|
if let Some(prev_transform) = cursor.prev_item() {
|
||||||
if prev_transform.block_disposition() != Some(BlockDisposition::Below)
|
if prev_transform.block_disposition() == Some(BlockDisposition::Below)
|
||||||
|| edit.old.end > cursor.start().row() + 1
|
&& edit.old.end == cursor.start().row() + 1
|
||||||
{
|
{
|
||||||
|
edit_follows_below_block = true;
|
||||||
|
} else {
|
||||||
|
edit_follows_below_block = false;
|
||||||
cursor.next(&());
|
cursor.next(&());
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
edit_follows_below_block = false;
|
||||||
cursor.next(&());
|
cursor.next(&());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -225,8 +231,8 @@ impl BlockMap {
|
||||||
.iter()
|
.iter()
|
||||||
.map(|block| (block.position.to_point(buffer).row, block)),
|
.map(|block| (block.position.to_point(buffer).row, block)),
|
||||||
);
|
);
|
||||||
blocks_in_edit.sort_unstable_by_key(|(row, block)| (*row, block.disposition));
|
blocks_in_edit.sort_unstable_by_key(|(row, block)| (*row, block.disposition, block.id));
|
||||||
dbg!(&blocks_in_edit);
|
// dbg!(&blocks_in_edit);
|
||||||
|
|
||||||
for (block_row, block) in blocks_in_edit.iter().copied() {
|
for (block_row, block) in blocks_in_edit.iter().copied() {
|
||||||
let new_transforms_end = new_transforms.summary().input;
|
let new_transforms_end = new_transforms.summary().input;
|
||||||
|
@ -252,14 +258,16 @@ impl BlockMap {
|
||||||
new_transforms.push(Transform::block(block.clone()), &());
|
new_transforms.push(Transform::block(block.clone()), &());
|
||||||
}
|
}
|
||||||
|
|
||||||
let new_transforms_end = new_transforms.summary().input;
|
if !edit_follows_below_block {
|
||||||
let edit_new_end_point =
|
let new_transforms_end = new_transforms.summary().input;
|
||||||
cmp::min(Point::new(edit.new.end, 0), wrap_snapshot.max_point().0);
|
let edit_new_end_point =
|
||||||
if new_transforms_end < edit_new_end_point {
|
cmp::min(Point::new(edit.new.end, 0), wrap_snapshot.max_point().0);
|
||||||
new_transforms.push(
|
if new_transforms_end < edit_new_end_point {
|
||||||
Transform::isomorphic(edit_new_end_point - new_transforms_end),
|
new_transforms.push(
|
||||||
&(),
|
Transform::isomorphic(edit_new_end_point - new_transforms_end),
|
||||||
);
|
&(),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
new_transforms.push_tree(cursor.suffix(&()), &());
|
new_transforms.push_tree(cursor.suffix(&()), &());
|
||||||
|
@ -309,13 +317,11 @@ impl<'a> BlockMapWriter<'a> {
|
||||||
let position = buffer.anchor_before(block.position);
|
let position = buffer.anchor_before(block.position);
|
||||||
let row = position.to_point(buffer).row;
|
let row = position.to_point(buffer).row;
|
||||||
|
|
||||||
let block_ix = match self.0.blocks.binary_search_by(|probe| {
|
let block_ix = match self
|
||||||
probe
|
.0
|
||||||
.position
|
.blocks
|
||||||
.cmp(&position, buffer)
|
.binary_search_by(|probe| probe.position.cmp(&position, buffer).unwrap())
|
||||||
.unwrap()
|
{
|
||||||
.then_with(|| probe.id.cmp(&id))
|
|
||||||
}) {
|
|
||||||
Ok(ix) | Err(ix) => ix,
|
Ok(ix) | Err(ix) => ix,
|
||||||
};
|
};
|
||||||
let mut text = block.text.into();
|
let mut text = block.text.into();
|
||||||
|
@ -741,7 +747,7 @@ mod tests {
|
||||||
.map(|i| i.parse().expect("invalid `OPERATIONS` variable"))
|
.map(|i| i.parse().expect("invalid `OPERATIONS` variable"))
|
||||||
.unwrap_or(10);
|
.unwrap_or(10);
|
||||||
|
|
||||||
let wrap_width = Some(rng.gen_range(0.0..=1000.0));
|
let wrap_width = None;
|
||||||
let tab_size = 1;
|
let tab_size = 1;
|
||||||
let family_id = cx.font_cache().load_family(&["Helvetica"]).unwrap();
|
let family_id = cx.font_cache().load_family(&["Helvetica"]).unwrap();
|
||||||
let font_id = cx
|
let font_id = cx
|
||||||
|
@ -767,17 +773,17 @@ mod tests {
|
||||||
|
|
||||||
for _ in 0..operations {
|
for _ in 0..operations {
|
||||||
match rng.gen_range(0..=100) {
|
match rng.gen_range(0..=100) {
|
||||||
0..=19 => {
|
// 0..=19 => {
|
||||||
let wrap_width = if rng.gen_bool(0.2) {
|
// let wrap_width = if rng.gen_bool(0.2) {
|
||||||
None
|
// None
|
||||||
} else {
|
// } else {
|
||||||
Some(rng.gen_range(0.0..=1000.0))
|
// Some(rng.gen_range(0.0..=1000.0))
|
||||||
};
|
// };
|
||||||
log::info!("Setting wrap width to {:?}", wrap_width);
|
// log::info!("Setting wrap width to {:?}", wrap_width);
|
||||||
wrap_map.update(cx, |map, cx| map.set_wrap_width(wrap_width, cx));
|
// wrap_map.update(cx, |map, cx| map.set_wrap_width(wrap_width, cx));
|
||||||
}
|
// }
|
||||||
20..=39 => {
|
20..=39 => {
|
||||||
let block_count = rng.gen_range(1..=4);
|
let block_count = rng.gen_range(1..=1);
|
||||||
let block_properties = (0..block_count)
|
let block_properties = (0..block_count)
|
||||||
.map(|_| {
|
.map(|_| {
|
||||||
let buffer = buffer.read(cx);
|
let buffer = buffer.read(cx);
|
||||||
|
@ -821,24 +827,24 @@ mod tests {
|
||||||
expected_blocks.push((block_id, props));
|
expected_blocks.push((block_id, props));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
40..=59 if !expected_blocks.is_empty() => {
|
// 40..=59 if !expected_blocks.is_empty() => {
|
||||||
let block_count = rng.gen_range(1..=4.min(expected_blocks.len()));
|
// let block_count = rng.gen_range(1..=4.min(expected_blocks.len()));
|
||||||
let block_ids_to_remove = (0..=block_count)
|
// let block_ids_to_remove = (0..block_count)
|
||||||
.map(|_| {
|
// .map(|_| {
|
||||||
expected_blocks
|
// expected_blocks
|
||||||
.remove(rng.gen_range(0..expected_blocks.len()))
|
// .remove(rng.gen_range(0..expected_blocks.len()))
|
||||||
.0
|
// .0
|
||||||
})
|
// })
|
||||||
.collect();
|
// .collect();
|
||||||
|
|
||||||
let (folds_snapshot, fold_edits) = fold_map.read(cx);
|
// let (folds_snapshot, fold_edits) = fold_map.read(cx);
|
||||||
let (tabs_snapshot, tab_edits) = tab_map.sync(folds_snapshot, fold_edits);
|
// let (tabs_snapshot, tab_edits) = tab_map.sync(folds_snapshot, fold_edits);
|
||||||
let (wraps_snapshot, wrap_edits) = wrap_map.update(cx, |wrap_map, cx| {
|
// let (wraps_snapshot, wrap_edits) = wrap_map.update(cx, |wrap_map, cx| {
|
||||||
wrap_map.sync(tabs_snapshot, tab_edits, cx)
|
// wrap_map.sync(tabs_snapshot, tab_edits, cx)
|
||||||
});
|
// });
|
||||||
let mut block_map = block_map.write(wraps_snapshot, wrap_edits, cx);
|
// let mut block_map = block_map.write(wraps_snapshot, wrap_edits, cx);
|
||||||
block_map.remove(block_ids_to_remove, cx);
|
// block_map.remove(block_ids_to_remove, cx);
|
||||||
}
|
// }
|
||||||
_ => {
|
_ => {
|
||||||
buffer.update(cx, |buffer, _| {
|
buffer.update(cx, |buffer, _| {
|
||||||
buffer.randomly_edit(&mut rng, 1);
|
buffer.randomly_edit(&mut rng, 1);
|
||||||
|
@ -853,11 +859,11 @@ mod tests {
|
||||||
wrap_map.sync(tabs_snapshot, tab_edits, cx)
|
wrap_map.sync(tabs_snapshot, tab_edits, cx)
|
||||||
});
|
});
|
||||||
let mut blocks_snapshot = block_map.read(wraps_snapshot.clone(), wrap_edits, cx);
|
let mut blocks_snapshot = block_map.read(wraps_snapshot.clone(), wrap_edits, cx);
|
||||||
log::info!("blocks text: {:?}", blocks_snapshot.text());
|
|
||||||
assert_eq!(
|
assert_eq!(
|
||||||
blocks_snapshot.transforms.summary().input,
|
blocks_snapshot.transforms.summary().input,
|
||||||
wraps_snapshot.max_point().0
|
wraps_snapshot.max_point().0
|
||||||
);
|
);
|
||||||
|
log::info!("blocks text: {:?}", blocks_snapshot.text());
|
||||||
|
|
||||||
let buffer = buffer.read(cx);
|
let buffer = buffer.read(cx);
|
||||||
let mut sorted_blocks = expected_blocks
|
let mut sorted_blocks = expected_blocks
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue