summaryrefslogtreecommitdiff
path: root/src/diff.rs
blob: 0d1140001b814888e9fcbf4df2cf46d7bd3aca24 (plain)
use std::ops::Range;

use imara_diff::{Algorithm, Diff, Hunk, InternedInput};

pub enum DiffSpan {
	Insertion(Range<u32>),
	Deletion(Range<u32>),
}

pub fn diff(before: &[u8], after: &[u8]) -> Vec<DiffSpan> {
	let input = InternedInput::new(before, after);
	let diff = Diff::compute(Algorithm::Histogram, &input);

	let hunks: Vec<Hunk> = diff.hunks().collect();
	let mut spans = Vec::with_capacity(hunks.len());
	for hunk in hunks {
		if !hunk.before.is_empty() {
			spans.push(DiffSpan::Deletion(hunk.before));
		}
		if !hunk.after.is_empty() {
			spans.push(DiffSpan::Insertion(hunk.after));
		}
	}

	spans
}