/// Creates a diff between old and new with the given algorithm capturing the ops. /// /// This is like [`diff`](crate::algorithms::diff) but instead of using an /// arbitrary hook this will always use [`Compact`] + [`Replace`] + [`Capture`] /// and return the captured [`DiffOp`]s. pubfn capture_diff<Old, New>(
alg: Algorithm,
old: &Old,
old_range: Range<usize>,
new: &New,
new_range: Range<usize>,
) -> Vec<DiffOp> where
Old: Index<usize> + ?Sized,
New: Index<usize> + ?Sized,
Old::Output: Hash + Eq + Ord,
New::Output: PartialEq<Old::Output> + Hash + Eq + Ord,
{
capture_diff_deadline(alg, old, old_range, new, new_range, None)
}
/// Creates a diff between old and new with the given algorithm capturing the ops. /// /// Works like [`capture_diff`] but with an optional deadline. pubfn capture_diff_deadline<Old, New>(
alg: Algorithm,
old: &Old,
old_range: Range<usize>,
new: &New,
new_range: Range<usize>,
deadline: Option<Instant>,
) -> Vec<DiffOp> where
Old: Index<usize> + ?Sized,
New: Index<usize> + ?Sized,
Old::Output: Hash + Eq + Ord,
New::Output: PartialEq<Old::Output> + Hash + Eq + Ord,
{ letmut d = Compact::new(Replace::new(Capture::new()), old, new);
diff_deadline(alg, &mut d, old, old_range, new, new_range, deadline).unwrap();
d.into_inner().into_inner().into_ops()
}
/// Creates a diff between old and new with the given algorithm capturing the ops. pubfn capture_diff_slices<T>(alg: Algorithm, old: &[T], new: &[T]) -> Vec<DiffOp> where
T: Eq + Hash + Ord,
{
capture_diff_slices_deadline(alg, old, new, None)
}
/// Creates a diff between old and new with the given algorithm capturing the ops. /// /// Works like [`capture_diff_slices`] but with an optional deadline. pubfn capture_diff_slices_deadline<T>(
alg: Algorithm,
old: &[T],
new: &[T],
deadline: Option<Instant>,
) -> Vec<DiffOp> where
T: Eq + Hash + Ord,
{
capture_diff_deadline(alg, old, 0..old.len(), new, 0..new.len(), deadline)
}
/// Return a measure of similarity in the range `0..=1`. /// /// A ratio of `1.0` means the two sequences are a complete match, a /// ratio of `0.0` would indicate completely distinct sequences. The input /// is the sequence of diff operations and the length of the old and new /// sequence. pubfn get_diff_ratio(ops: &[DiffOp], old_len: usize, new_len: usize) -> f32 { let matches = ops
.iter()
.map(|op| { iflet DiffOp::Equal { len, .. } = *op {
len
} else { 0
}
})
.sum::<usize>(); let len = old_len + new_len; if len == 0 { 1.0
} else { 2.0 * matches as f32 / len as f32
}
}
/// Isolate change clusters by eliminating ranges with no changes. /// /// This will leave holes behind in long periods of equal ranges so that /// you can build things like unified diffs. pubfn group_diff_ops(mut ops: Vec<DiffOp>, n: usize) -> Vec<Vec<DiffOp>> { if ops.is_empty() { return vec![];
}
for op in ops.into_iter() { iflet DiffOp::Equal {
old_index,
new_index,
len,
} = op
{ // End the current group and start a new one whenever // there is a large range with no changes. if len > n * 2 {
pending_group.push(DiffOp::Equal {
old_index,
new_index,
len: n,
});
rv.push(pending_group); let offset = len.saturating_sub(n);
pending_group = vec![DiffOp::Equal {
old_index: old_index + offset,
new_index: new_index + offset,
len: len - offset,
}]; continue;
}
}
pending_group.push(op);
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.