Module Diff2.Make

Functor building an implementation of the diff structure given a sequence type.

Parameters

module M : SeqType

Signature

type t = M.t

The type of input sequence.

type elem = M.elem

The type of the elements of result / input sequence.

val lcs : ?equal:(elem -> elem -> bool) -> t -> t -> elem common list

lcs ~equal seq1 seq2 computes the LCS (longest common sequence) of seq1 and seq2. Elements of seq1 and seq2 are compared with equal. equal defaults to Pervasives.(=).

Elements of lcs are `Common (pos1, pos2, e) where e is an element, pos1 is a position in seq1, and pos2 is a position in seq2.

val diff : ?equal:(elem -> elem -> bool) -> t -> t -> elem edit list

diff ~equal seq1 seq2 computes the diff of seq1 and seq2. Elements of seq1 and seq2 are compared with equal.

Elements only in seq1 are represented as `Removed (pos, e) where e is an element, and pos is a position in seq1; those only in seq2 are represented as `Added (pos, e) where e is an element, and pos is a position in seq2; those common in seq1 and seq2 are represented as `Common (pos1, pos2, e) where e is an element, pos1 is a position in seq1, and pos2 is a position in seq2.

val fold_left : ?equal:(elem -> elem -> bool) -> f:('a -> elem edit -> 'a) -> init:'a -> t -> t -> 'a

fold_left ~equal ~f ~init seq1 seq2 is same as diff ~equal seq1 seq2 |> ListLabels.fold_left ~f ~init, but does not create an intermediate list.

val iter : ?equal:(elem -> elem -> bool) -> f:(elem edit -> unit) -> t -> t -> unit

iter ~equal ~f seq1 seq2 is same as diff ~equal seq1 seq2 |> ListLabels.iter ~f, but does not create an intermediate list.