diff --git a/src/differ.rs b/src/differ.rs index a021e2f..6eb5eba 100644 --- a/src/differ.rs +++ b/src/differ.rs @@ -1,4 +1,4 @@ -use sequencematcher::{Sequence, SequenceMatcher}; +use sequencematcher::SequenceMatcher; use std::cmp; use utils::{count_leading, str_with_similar_chars}; @@ -15,11 +15,7 @@ impl Differ { } } - pub fn compare( - &self, - first_sequence: &T, - second_sequence: &T, - ) -> Vec { + pub fn compare(&self, first_sequence: &[&str], second_sequence: &[&str]) -> Vec { let mut matcher = SequenceMatcher::new(first_sequence, second_sequence); matcher.set_is_junk(self.line_junk); let mut res = Vec::new(); @@ -54,16 +50,10 @@ impl Differ { res } - fn dump( - &self, - tag: &str, - sequence: &T, - start: usize, - end: usize, - ) -> Vec { + fn dump(&self, tag: &str, sequence: &[&str], start: usize, end: usize) -> Vec { let mut res = Vec::new(); for i in start..end { - match sequence.at_index(i) { + match sequence.get(i) { Some(s) => res.push(format!("{} {}", tag, s)), None => {} } @@ -71,12 +61,12 @@ impl Differ { res } - fn plain_replace( + fn plain_replace( &self, - first_sequence: &T, + first_sequence: &[&str], first_start: usize, first_end: usize, - second_sequence: &T, + second_sequence: &[&str], second_start: usize, second_end: usize, ) -> Vec { @@ -98,12 +88,12 @@ impl Differ { first } - fn fancy_replace( + fn fancy_replace( &self, - first_sequence: &T, + first_sequence: &[&str], first_start: usize, first_end: usize, - second_sequence: &T, + second_sequence: &[&str], second_start: usize, second_end: usize, ) -> Vec { @@ -114,9 +104,9 @@ impl Differ { let mut eqi: Option = None; let mut eqj: Option = None; for j in second_start..second_end { - second_sequence_str = second_sequence.at_index(j).unwrap(); + second_sequence_str = &second_sequence[j]; for i in first_start..first_end { - first_sequence_str = first_sequence.at_index(i).unwrap(); + first_sequence_str = &first_sequence[i]; if first_sequence_str == second_sequence_str { if eqi.is_none() { eqi = Some(i); @@ -124,7 +114,7 @@ impl Differ { } continue; } - let mut cruncher = SequenceMatcher::new(first_sequence_str, second_sequence_str); + let mut cruncher = SequenceMatcher::new(*first_sequence_str, *second_sequence_str); cruncher.set_is_junk(self.char_junk); if cruncher.ratio() > best_ratio { best_ratio = cruncher.ratio(); @@ -164,13 +154,11 @@ impl Differ { ).iter() .cloned(), ); - let (first_element, second_element) = ( - first_sequence.at_index(best_i).unwrap(), - second_sequence.at_index(best_j).unwrap(), - ); + let first_element = &first_sequence[best_i]; + let second_element = &second_sequence[best_j]; if eqi.is_none() { let (mut first_tag, mut second_tag) = (String::new(), String::new()); - let mut cruncher = SequenceMatcher::new(first_element, second_element); + let mut cruncher = SequenceMatcher::new(*first_element, second_element); cruncher.set_is_junk(self.char_junk); for opcode in &cruncher.get_opcodes() { let (first_length, second_length) = ( @@ -219,12 +207,12 @@ impl Differ { res } - fn fancy_helper( + fn fancy_helper( &self, - first_sequence: &T, + first_sequence: &[&str], first_start: usize, first_end: usize, - second_sequence: &T, + second_sequence: &[&str], second_start: usize, second_end: usize, ) -> Vec { diff --git a/src/sequencematcher.rs b/src/sequencematcher.rs index 0dc645b..4256507 100644 --- a/src/sequencematcher.rs +++ b/src/sequencematcher.rs @@ -104,6 +104,19 @@ impl<'a> Sequence for Vec { } } +impl<'a> Sequence for [&'a str] { + fn len(&self) -> usize { + self.len() + } + + fn at_index(&self, index: usize) -> Option<&str> { + if index < self.len() { + return Some(self[index]); + } + None + } +} + pub struct SequenceMatcher<'a, T: 'a + ?Sized + Sequence> { first_sequence: &'a T, second_sequence: &'a T,