mirror of https://github.com/helix-editor/helix
Remove ExactSizeIterator requirement on Transaction::change
Size hint is enough.pull/469/head
parent
cd65a48635
commit
bf43fabf65
|
@ -1,6 +1,4 @@
|
||||||
use ropey::Rope;
|
use crate::{Rope, Transaction};
|
||||||
|
|
||||||
use crate::{Change, Transaction};
|
|
||||||
|
|
||||||
/// Compares `old` and `new` to generate a [`Transaction`] describing
|
/// Compares `old` and `new` to generate a [`Transaction`] describing
|
||||||
/// the steps required to get from `old` to `new`.
|
/// the steps required to get from `old` to `new`.
|
||||||
|
@ -25,8 +23,9 @@ pub fn compare_ropes(old: &Rope, new: &Rope) -> Transaction {
|
||||||
// The current position of the change needs to be tracked to
|
// The current position of the change needs to be tracked to
|
||||||
// construct the `Change`s.
|
// construct the `Change`s.
|
||||||
let mut pos = 0;
|
let mut pos = 0;
|
||||||
let changes: Vec<Change> = diff
|
Transaction::change(
|
||||||
.ops()
|
old,
|
||||||
|
diff.ops()
|
||||||
.iter()
|
.iter()
|
||||||
.map(|op| op.as_tag_tuple())
|
.map(|op| op.as_tag_tuple())
|
||||||
.filter_map(|(tag, old_range, new_range)| {
|
.filter_map(|(tag, old_range, new_range)| {
|
||||||
|
@ -50,9 +49,8 @@ pub fn compare_ropes(old: &Rope, new: &Rope) -> Transaction {
|
||||||
similar::DiffTag::Delete => Some((old_pos, pos, None)),
|
similar::DiffTag::Delete => Some((old_pos, pos, None)),
|
||||||
similar::DiffTag::Equal => None,
|
similar::DiffTag::Equal => None,
|
||||||
}
|
}
|
||||||
})
|
}),
|
||||||
.collect();
|
)
|
||||||
Transaction::change(old, changes.into_iter())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
|
|
|
@ -473,11 +473,13 @@ impl Transaction {
|
||||||
/// Generate a transaction from a set of changes.
|
/// Generate a transaction from a set of changes.
|
||||||
pub fn change<I>(doc: &Rope, changes: I) -> Self
|
pub fn change<I>(doc: &Rope, changes: I) -> Self
|
||||||
where
|
where
|
||||||
I: IntoIterator<Item = Change> + ExactSizeIterator,
|
I: IntoIterator<Item = Change> + Iterator,
|
||||||
{
|
{
|
||||||
let len = doc.len_chars();
|
let len = doc.len_chars();
|
||||||
|
|
||||||
let mut changeset = ChangeSet::with_capacity(2 * changes.len() + 1); // rough estimate
|
let (lower, upper) = changes.size_hint();
|
||||||
|
let size = upper.unwrap_or(lower);
|
||||||
|
let mut changeset = ChangeSet::with_capacity(2 * size + 1); // rough estimate
|
||||||
|
|
||||||
// TODO: verify ranges are ordered and not overlapping or change will panic.
|
// TODO: verify ranges are ordered and not overlapping or change will panic.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue