#diff #slice #patch #lcs #longest #change #comparison

slice-diff-patch

Library crate providing utility functions for diff and patch of slices

11 releases (6 stable)

1.2.3 Aug 6, 2024
1.2.2 Jul 22, 2024
1.2.1 Feb 11, 2022
0.3.0 Feb 7, 2022
0.1.0 Feb 5, 2022

#370 in Rust patterns


Used in kifi

MIT license

18KB
358 lines

This crate provides the Change enum as an abstraction for diff::Result, lcs_diff::DiffResult, and wu_diff::DiffResult; the diff_changes(), diff_diff(), lcs_changes(), lcs_diff(), wu_changes(), and wu_diff() functions to calculate or process diffs between a and b slices via LCS (Longest Common Subsequence) or Wu diff algorithms into a Vec<Change>, the patch() function to reproduce b from the a slice and Vec<Change>, and the insert() and remove() functions to enable writing a custom changes function.

use slice_diff_patch::*;

let a = vec!["one", "TWO", "three", "four"];
let b = vec!["zero", "one", "two", "four"];

let diff = diff_diff(&a, &b);
assert_eq!(
    diff,
    vec![
        Change::Insert((0, "zero")),
        Change::Remove(2),
        Change::Update((2, "two")),
    ],
);
assert_eq!(patch(&a, &diff), b);

let lcs = lcs_diff(&a, &b);
assert_eq!(
    lcs,
    vec![
        Change::Insert((0, "zero")),
        Change::Update((2, "two")),
        Change::Remove(3),
    ],
);
assert_eq!(patch(&a, &lcs), b);

let wu = wu_diff(&a, &b);
assert_eq!(
    wu,
    vec![
        Change::Insert((0, "zero")),
        Change::Remove(2),
        Change::Update((2, "two")),
    ],
);
assert_eq!(patch(&a, &wu), b);

See also:

Dependencies

~93KB