functor (D : Defs->
  sig
    type nonrec change = (D.left, D.right, D.eq, D.diff) Diffing.change
    type patch = Diffing.Define.change list
    module type Parameters =
      sig
        type update_result
        val weight : Diffing.Define.change -> int
        val test :
          D.state -> D.left -> D.right -> (D.eq, D.diff) Stdlib.result
        val update :
          Diffing.Define.change ->
          D.state -> Diffing.Define.Parameters.update_result
      end
    module type S =
      sig
        val diff :
          D.state -> D.left array -> D.right array -> Diffing.Define.patch
      end
    module Simple :
      sig
        val weight : change -> int
        val test : D.state -> D.left -> D.right -> (D.eq, D.diff) result
        val update : change -> D.state -> D.state
      end -> S
    module Left_variadic :
      sig
        val weight : change -> int
        val test : D.state -> D.left -> D.right -> (D.eq, D.diff) result
        val update : change -> D.state -> D.state * D.left array
      end -> S
    module Right_variadic :
      sig
        val weight : change -> int
        val test : D.state -> D.left -> D.right -> (D.eq, D.diff) result
        val update : change -> D.state -> D.state * D.right array
      end -> S
  end