sig
  module type S =
    sig
      type ('a, 'b) generator
      type ('a, 'b) mutator
      type ('a, 'b) observer
      type ('a, 'b) op
      val op_to_string : ('a, 'b) Reins.DugADT.S.op -> string
      val coerce_gen :
        ('a, 'b) Reins.DugADT.S.generator -> ('a, 'b) Reins.DugADT.S.op
      val coerce_mut :
        ('a, 'b) Reins.DugADT.S.mutator -> ('a, 'b) Reins.DugADT.S.op
      val coerce_obs :
        ('a, 'b) Reins.DugADT.S.observer -> ('a, 'b) Reins.DugADT.S.op
      val classify :
        ('a, 'b) Reins.DugADT.S.op ->
        (('a, 'b) Reins.DugADT.S.generator, ('a, 'b) Reins.DugADT.S.mutator,
         ('a, 'b) Reins.DugADT.S.observer)
        Reins.Dug.kind
      val strip :
        ('a, 'b) Reins.DugADT.S.op -> (unit, unit) Reins.DugADT.S.op
      val op_dependencies : ('a, Dug.Id.t) Reins.DugADT.S.op -> Dug.Id.t list
      val create_op :
        (unit, unit) Reins.DugADT.S.op ->
        Dug.Id.t ->
        (unit -> 'a) -> (int -> Dug.Id.t) -> ('a, Dug.Id.t) Reins.DugADT.S.op
    end
end