#diff #slice #patch #lcs #function #longest #utility

slice-diff-patch

Library crate providing utility functions for diff and patch of slices

10 releases (5 stable)

new 1.2.2 Jul 22, 2024
1.2.1 Feb 11, 2022
0.3.0 Feb 7, 2022
0.2.2 Feb 5, 2022
0.1.0 Feb 5, 2022

#343 in Rust patterns

Download history 17/week @ 2024-04-03 4/week @ 2024-04-10 8/week @ 2024-04-17 18/week @ 2024-04-24 8/week @ 2024-05-01 2/week @ 2024-05-08 3/week @ 2024-05-29 2/week @ 2024-06-05 1/week @ 2024-06-19 2/week @ 2024-06-26 24/week @ 2024-07-03 3/week @ 2024-07-10 85/week @ 2024-07-17

115 downloads per month
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:

Changelog:

  • 0.1.0: initial
  • 0.2.0: add support for diff crate
  • 0.2.1: fix readme
  • 0.2.2: fix readme
  • 0.3.0: derive Clone on Change
  • 1.0.0: add Update variant on Change
  • 1.1.0: add doc test example
  • 1.1.1: fix readme
  • 1.2.1: expose remove() and insert() functions
  • 1.2.2: update dependencies; rustfmt

Dependencies

~93KB