sig
  type ('a, 'b) generator
  type ('a, 'b) mutator
  type ('a, 'b) observer
  type ('a, 'b) op
  val op_to_string : ('a, 'b) op -> string
  val coerce_gen : ('a, 'b) generator -> ('a, 'b) op
  val coerce_mut : ('a, 'b) mutator -> ('a, 'b) op
  val coerce_obs : ('a, 'b) observer -> ('a, 'b) op
  val classify :
    ('a, 'b) op ->
    (('a, 'b) generator, ('a, 'b) mutator, ('a, 'b) observer) Dug.kind
  val strip : ('a, 'b) 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
  module Extractor :
    functor (A : Types.Mono.ArbitraryComparable->
      sig
        type t
        type elt = A.t
        type cursor
        type 'a result = 'a
        type 'a elt_ = elt
        type 'a set = t
        type ('a, 'b) result_ = 'a result
        val empty : 'a set
        val is_empty : 'a set -> bool
        val mem : 'a elt_ -> 'a set -> (bool, 'a) result_
        val add : 'a elt_ -> 'a set -> 'a set
        val singleton : 'a elt_ -> 'a set
        val remove : 'a elt_ -> 'a set -> 'a set
        val min_elt : 'a set -> ('a elt_, 'a) result_
        val max_elt : 'a set -> ('a elt_, 'a) result_
        val choose : 'a set -> ('a elt_, 'a) result_
        val cardinal : 'a set -> int
        val compare : 'a set -> 'a set -> int
        val equal : 'a set -> 'a set -> bool
        val iter : ('a elt_ -> unit) -> 'a set -> unit
        val fold : ('-> 'b elt_ -> 'a) -> '-> 'b set -> 'a
        val union : 'a set -> 'a set -> 'a set
        val inter : 'a set -> 'a set -> 'a set
        val diff : 'a set -> 'a set -> 'a set
        val gen1 :
          (?size:int -> Random.State.t -> 'a elt_) ->
          ?size:int -> Random.State.t -> 'a set
        val well_formed : 'a set -> bool
        val of_result : ('a, 'b) result_ -> 'a
        type 'a cursor_ = cursor
        val to_cursor : 'a set -> 'a cursor_
        val from_cursor : 'a cursor_ -> 'a set
        val at_top : 'a cursor_ -> bool
        val at_left : 'a cursor_ -> bool
        val at_right : 'a cursor_ -> bool
        val move_up : 'a cursor_ -> 'a cursor_
        val move_down_left : 'a cursor_ -> 'a cursor_
        val move_down_right : 'a cursor_ -> 'a cursor_
        val went_left : 'a cursor_ -> bool
        val went_right : 'a cursor_ -> bool
        val has_value : 'a cursor_ -> bool
        val get_value : 'a cursor_ -> 'a elt_
        val to_string : 'a set -> string
        val gen : ?size:int -> Random.State.t -> t
        val get_dug :
          unit ->
          ((elt, Dug.Id.t) generator, (elt, Dug.Id.t) mutator,
           (elt, Dug.Id.t) observer)
          Reins.Dug.t
        val clear_profile : unit -> unit
      end
  module Benchmark :
    functor
      (S : sig
             type t
             type elt
             type cursor
             type 'a result = 'a
             type 'a elt_ = elt
             type 'a set = t
             type ('a, 'b) result_ = 'a result
             val empty : 'a set
             val is_empty : 'a set -> bool
             val mem : 'a elt_ -> 'a set -> (bool, 'a) result_
             val add : 'a elt_ -> 'a set -> 'a set
             val singleton : 'a elt_ -> 'a set
             val remove : 'a elt_ -> 'a set -> 'a set
             val min_elt : 'a set -> ('a elt_, 'a) result_
             val max_elt : 'a set -> ('a elt_, 'a) result_
             val choose : 'a set -> ('a elt_, 'a) result_
             val cardinal : 'a set -> int
             val compare : 'a set -> 'a set -> int
             val equal : 'a set -> 'a set -> bool
             val iter : ('a elt_ -> unit) -> 'a set -> unit
             val fold : ('-> 'b elt_ -> 'a) -> '-> 'b set -> 'a
             val union : 'a set -> 'a set -> 'a set
             val inter : 'a set -> 'a set -> 'a set
             val diff : 'a set -> 'a set -> 'a set
             val gen1 :
               (?size:int -> Random.State.t -> 'a elt_) ->
               ?size:int -> Random.State.t -> 'a set
             val well_formed : 'a set -> bool
             val of_result : ('a, 'b) result_ -> 'a
             type 'a cursor_ = cursor
             val to_cursor : 'a set -> 'a cursor_
             val from_cursor : 'a cursor_ -> 'a set
             val at_top : 'a cursor_ -> bool
             val at_left : 'a cursor_ -> bool
             val at_right : 'a cursor_ -> bool
             val move_up : 'a cursor_ -> 'a cursor_
             val move_down_left : 'a cursor_ -> 'a cursor_
             val move_down_right : 'a cursor_ -> 'a cursor_
             val went_left : 'a cursor_ -> bool
             val went_right : 'a cursor_ -> bool
             val has_value : 'a cursor_ -> bool
             val get_value : 'a cursor_ -> 'a elt_
             val to_string : 'a set -> string
             val gen : ?size:int -> Random.State.t -> t
           end->
      sig
        val benchmark :
          ((S.elt, Dug.Id.t) generator, (S.elt, Dug.Id.t) mutator,
           (S.elt, Dug.Id.t) observer)
          Reins.Dug.t -> float
      end
end