sig
  type t
  type elt
  val length : t -> int
  val is_empty : t -> bool
  val iter : t -> f:(elt -> unit) -> unit
  val fold : t -> init:'accum -> f:('accum -> elt -> 'accum) -> 'accum
  val exists : t -> f:(elt -> bool) -> bool
  val for_all : t -> f:(elt -> bool) -> bool
  val count : t -> f:(elt -> bool) -> int
  val find : t -> f:(elt -> bool) -> elt option
  val find_map : t -> f:(elt -> 'a option) -> 'a option
  val to_list : t -> elt list
  val to_array : t -> elt array
  type tree
  val invariants : t -> bool
  val mem : t -> elt -> bool
  val add : t -> elt -> t
  val remove : t -> elt -> t
  val union : t -> t -> t
  val inter : t -> t -> t
  val diff : t -> t -> t
  val compare_direct : t -> t -> int
  val equal : t -> t -> bool
  val subset : t -> t -> bool
  val fold_until :
    t -> init:'-> f:('-> elt -> [ `Continue of '| `Stop of 'b ]) -> 'b
  val fold_right : t -> init:'-> f:(elt -> '-> 'b) -> 'b
  val iter2 :
    t ->
    t ->
    f:([ `Both of elt * elt | `Left of elt | `Right of elt ] -> unit) -> unit
  val filter : t -> f:(elt -> bool) -> t
  val partition_tf : t -> f:(elt -> bool) -> t * t
  val elements : t -> elt list
  val min_elt : t -> elt option
  val min_elt_exn : t -> elt
  val max_elt : t -> elt option
  val max_elt_exn : t -> elt
  val choose : t -> elt option
  val choose_exn : t -> elt
  val split : t -> elt -> t * bool * t
  val group_by : t -> equiv:(elt -> elt -> bool) -> t list
  val find_exn : t -> f:(elt -> bool) -> elt
  val find_index : t -> int -> elt option
  val remove_index : t -> int -> t
  val to_tree : t -> tree
  type ('a, 'cmp) set
  val empty : t
  val singleton : elt -> t
  val union_list : t list -> t
  val of_list : elt list -> t
  val of_array : elt array -> t
  val of_sorted_array : elt array -> t Or_error.t
  val of_sorted_array_unchecked : elt array -> t
  val stable_dedup_list : elt list -> elt list
  val map : ('a, 'b) set -> f:('-> elt) -> t
  val filter_map : ('a, 'b) set -> f:('-> elt option) -> t
  val of_tree : tree -> t
end