sig
  module type RestrictedSet =
    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
  module type ProfiledSet =
    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
      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
    end
end