From edee567e61f76c8a3007d8ba0b505e953fd0d676 Mon Sep 17 00:00:00 2001 From: Wilfred Hughes Date: Sat, 12 Mar 2022 12:15:59 -0800 Subject: [PATCH] Factor out a myers_diff module --- src/line_parser.rs | 25 ++++++++----------------- src/main.rs | 1 + src/myers_diff.rs | 21 +++++++++++++++++++++ 3 files changed, 30 insertions(+), 17 deletions(-) create mode 100644 src/myers_diff.rs diff --git a/src/line_parser.rs b/src/line_parser.rs index 5b967cd4f..a25604707 100644 --- a/src/line_parser.rs +++ b/src/line_parser.rs @@ -8,6 +8,7 @@ use rustc_hash::FxHashMap; use crate::{ lines::NewlinePositions, + myers_diff, syntax::{split_words, AtomKind, MatchKind, MatchedPos, TokenKind}, }; @@ -109,25 +110,15 @@ fn diff_slice_by_hash<'a, T: Eq + Hash>(lhs: &'a [T], rhs: &'a [T]) -> Vec { - let id = lhs_ids[r.old_index.unwrap()]; - diff::Result::Left(*id_values.get(&id).unwrap()) - } - wu_diff::DiffResult::Common(c) => { - let lhs_id = lhs_ids[c.old_index.unwrap()]; - let rhs_id = rhs_ids[c.new_index.unwrap()]; - diff::Result::Both( - *id_values.get(&lhs_id).unwrap(), - *id_values.get(&rhs_id).unwrap(), - ) - } - wu_diff::DiffResult::Added(a) => { - let id = rhs_ids[a.new_index.unwrap()]; - diff::Result::Right(*id_values.get(&id).unwrap()) - } + myers_diff::DiffResult::Left(id) => diff::Result::Left(*id_values.get(id).unwrap()), + myers_diff::DiffResult::Both(lhs_id, rhs_id) => diff::Result::Both( + *id_values.get(lhs_id).unwrap(), + *id_values.get(rhs_id).unwrap(), + ), + myers_diff::DiffResult::Right(id) => diff::Result::Right(*id_values.get(id).unwrap()), }) .collect::>>() } diff --git a/src/main.rs b/src/main.rs index 7dc272023..43c9b9f9a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -26,6 +26,7 @@ mod summary; mod syntax; mod tree_sitter_parser; mod unchanged; +mod myers_diff; #[macro_use] extern crate log; diff --git a/src/myers_diff.rs b/src/myers_diff.rs new file mode 100644 index 000000000..af0409267 --- /dev/null +++ b/src/myers_diff.rs @@ -0,0 +1,21 @@ +#[derive(Debug)] +pub enum DiffResult { + Left(T), + Both(T, T), + Right(T), +} + +pub fn slice<'a, T: PartialEq + Clone>(lhs: &'a [T], rhs: &'a [T]) -> Vec> { + wu_diff::diff(lhs, rhs) + .into_iter() + .map(|result| match result { + wu_diff::DiffResult::Removed(r) => DiffResult::Left(&lhs[r.old_index.unwrap()]), + wu_diff::DiffResult::Common(c) => { + let lhs_id = c.old_index.unwrap(); + let rhs_id = c.new_index.unwrap(); + DiffResult::Both(&lhs[lhs_id], &rhs[rhs_id]) + } + wu_diff::DiffResult::Added(a) => DiffResult::Right(&rhs[a.new_index.unwrap()]), + }) + .collect::>() +}