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