sig
  module Matching_block :
    sig type t = { mine_start : int; other_start : int; length : int; } end
  val get_matching_blocks :
    transform:('-> 'b) ->
    compare:('-> '-> int) ->
    mine:'a array -> other:'a array -> Patience_diff.Matching_block.t list
  val ratio : 'a array -> 'a array -> float
  module Range :
    sig
      type 'a t =
          Same of ('a * 'a) array
        | Old of 'a array
        | New of 'a array
        | Replace of 'a array * 'a array
        | Unified of 'a array
      val all_same : 'Patience_diff.Range.t list -> bool
      val old_only :
        'Patience_diff.Range.t list -> 'Patience_diff.Range.t list
      val new_only :
        'Patience_diff.Range.t list -> 'Patience_diff.Range.t list
      val t_of_sexp :
        (Sexplib.Sexp.t -> 'a) -> Sexplib.Sexp.t -> 'Patience_diff.Range.t
      val sexp_of_t :
        ('-> Sexplib.Sexp.t) -> 'Patience_diff.Range.t -> Sexplib.Sexp.t
    end
  module Hunk :
    sig
      type 'a t = {
        mine_start : int;
        mine_size : int;
        other_start : int;
        other_size : int;
        ranges : 'Patience_diff.Range.t list;
      }
      val all_same : 'Patience_diff.Hunk.t -> bool
    end
  val get_hunks :
    transform:('-> 'b) ->
    compare:('-> '-> int) ->
    context:int ->
    mine:'a array -> other:'a array -> 'Patience_diff.Hunk.t list
  val print_ranges : string Patience_diff.Hunk.t -> unit
  val all_same : 'Patience_diff.Hunk.t list -> bool
  val unified : 'Patience_diff.Hunk.t list -> 'Patience_diff.Hunk.t list
  val old_only : 'Patience_diff.Hunk.t list -> 'Patience_diff.Hunk.t list
  val new_only : 'Patience_diff.Hunk.t list -> 'Patience_diff.Hunk.t list
  val ranges : 'Patience_diff.Hunk.t list -> 'Patience_diff.Range.t list
  type 'a segment = Same of 'a array | Different of 'a array array
  type 'a merged_array = 'Patience_diff.segment list
  val merge : 'a array array -> 'Patience_diff.merged_array
end