sig
  type ('left, 'right, 'eq, 'diff) change =
      Delete of 'left
    | Insert of 'right
    | Keep of 'left * 'right * 'eq
    | Change of 'left * 'right * 'diff
  val map :
    ('l1 -> 'l2) ->
    ('r1 -> 'r2) ->
    ('l1, 'r1, 'eq, 'diff) Diffing.change ->
    ('l2, 'r2, 'eq, 'diff) Diffing.change
  type ('l, 'r, 'eq, 'diff) patch = ('l, 'r, 'eq, 'diff) Diffing.change list
  val diff :
    weight:(('l, 'r, 'eq, 'diff) Diffing.change -> int) ->
    test:('state -> '-> '-> ('eq, 'diff) Stdlib.result) ->
    update:(('l, 'r, 'eq, 'diff) Diffing.change -> 'state -> 'state) ->
    'state -> 'l array -> 'r array -> ('l, 'r, 'eq, 'diff) Diffing.patch
  type ('l, 'r, 'e, 'd, 'state) update =
      Without_extensions of
        (('l, 'r, 'e, 'd) Diffing.change -> 'state -> 'state)
    | With_left_extensions of
        (('l, 'r, 'e, 'd) Diffing.change -> 'state -> 'state * 'l array)
    | With_right_extensions of
        (('l, 'r, 'e, 'd) Diffing.change -> 'state -> 'state * 'r array)
  val variadic_diff :
    weight:(('l, 'r, 'eq, 'diff) Diffing.change -> int) ->
    test:('state -> '-> '-> ('eq, 'diff) Stdlib.result) ->
    update:('l, 'r, 'eq, 'diff, 'state) Diffing.update ->
    'state -> 'l array -> 'r array -> ('l, 'r, 'eq, 'diff) Diffing.patch
end