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