OCaml compiler library : Diffing

`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 -> 'l -> 'r -> ('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 -> 'l -> 'r -> ('eq, 'diff) Stdlib.result) ->
update:('l, 'r, 'eq, 'diff, 'state) Diffing.update ->
'state -> 'l array -> 'r array -> ('l, 'r, 'eq, 'diff) Diffing.patch
end`