sig
  module Elt :
    sig
      type t = t
      val compare : t -> t -> int
      val t_of_sexp : Sexplib.Sexp.t -> t
      val sexp_of_t : t -> Sexplib.Sexp.t
      type comparator = comparator
      val comparator : (t, comparator) Comparator.t_
    end
  module Tree :
    sig
      type t = (Elt.t, Elt.comparator) Core_set.Tree.t
      val length : t -> int
      val is_empty : t -> bool
      val iter : t -> f:(Elt.t -> unit) -> unit
      val fold : t -> init:'accum -> f:('accum -> Elt.t -> 'accum) -> 'accum
      val exists : t -> f:(Elt.t -> bool) -> bool
      val for_all : t -> f:(Elt.t -> bool) -> bool
      val count : t -> f:(Elt.t -> bool) -> int
      val find : t -> f:(Elt.t -> bool) -> Elt.t option
      val find_map : t -> f:(Elt.t -> 'a option) -> 'a option
      val to_list : t -> Elt.t list
      val to_array : t -> Elt.t array
      val invariants : t -> bool
      val mem : t -> Elt.t -> bool
      val add : t -> Elt.t -> t
      val remove : t -> Elt.t -> 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.t -> [ `Continue of '| `Stop of 'b ]) -> 'b
      val fold_right : t -> init:'-> f:(Elt.t -> '-> 'b) -> 'b
      val iter2 :
        t ->
        t ->
        f:([ `Both of Elt.t * Elt.t | `Left of Elt.t | `Right of Elt.t ] ->
           unit) ->
        unit
      val filter : t -> f:(Elt.t -> bool) -> t
      val partition_tf : t -> f:(Elt.t -> bool) -> t * t
      val elements : t -> Elt.t list
      val min_elt : t -> Elt.t option
      val min_elt_exn : t -> Elt.t
      val max_elt : t -> Elt.t option
      val max_elt_exn : t -> Elt.t
      val choose : t -> Elt.t option
      val choose_exn : t -> Elt.t
      val split : t -> Elt.t -> t * bool * t
      val group_by : t -> equiv:(Elt.t -> Elt.t -> bool) -> t list
      val find_exn : t -> f:(Elt.t -> bool) -> Elt.t
      val find_index : t -> int -> Elt.t option
      val remove_index : t -> int -> t
      val to_tree : t -> t
      val empty : t
      val singleton : Elt.t -> t
      val union_list : t list -> t
      val of_list : Elt.t list -> t
      val of_array : Elt.t array -> t
      val of_sorted_array : Elt.t array -> t Or_error.t
      val of_sorted_array_unchecked : Elt.t array -> t
      val stable_dedup_list : Elt.t list -> Elt.t list
      val map : ('a, 'b) Core_set.Tree.t -> f:('-> Elt.t) -> t
      val filter_map :
        ('a, 'b) Core_set.Tree.t -> f:('-> Elt.t option) -> t
      val of_tree : t -> t
      val t_of_sexp : Sexplib.Sexp.t -> t
      val sexp_of_t : t -> Sexplib.Sexp.t
      val compare : t -> t -> int
    end
  type t = (Elt.t, Elt.comparator) Core_set.t
  val length : t -> int
  val is_empty : t -> bool
  val iter : t -> f:(Elt.t -> unit) -> unit
  val fold : t -> init:'accum -> f:('accum -> Elt.t -> 'accum) -> 'accum
  val exists : t -> f:(Elt.t -> bool) -> bool
  val for_all : t -> f:(Elt.t -> bool) -> bool
  val count : t -> f:(Elt.t -> bool) -> int
  val find : t -> f:(Elt.t -> bool) -> Elt.t option
  val find_map : t -> f:(Elt.t -> 'a option) -> 'a option
  val to_list : t -> Elt.t list
  val to_array : t -> Elt.t array
  val invariants : t -> bool
  val mem : t -> Elt.t -> bool
  val add : t -> Elt.t -> t
  val remove : t -> Elt.t -> 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.t -> [ `Continue of '| `Stop of 'b ]) -> 'b
  val fold_right : t -> init:'-> f:(Elt.t -> '-> 'b) -> 'b
  val iter2 :
    t ->
    t ->
    f:([ `Both of Elt.t * Elt.t | `Left of Elt.t | `Right of Elt.t ] -> unit) ->
    unit
  val filter : t -> f:(Elt.t -> bool) -> t
  val partition_tf : t -> f:(Elt.t -> bool) -> t * t
  val elements : t -> Elt.t list
  val min_elt : t -> Elt.t option
  val min_elt_exn : t -> Elt.t
  val max_elt : t -> Elt.t option
  val max_elt_exn : t -> Elt.t
  val choose : t -> Elt.t option
  val choose_exn : t -> Elt.t
  val split : t -> Elt.t -> t * bool * t
  val group_by : t -> equiv:(Elt.t -> Elt.t -> bool) -> t list
  val find_exn : t -> f:(Elt.t -> bool) -> Elt.t
  val find_index : t -> int -> Elt.t option
  val remove_index : t -> int -> t
  val to_tree : t -> Tree.t
  val empty : t
  val singleton : Elt.t -> t
  val union_list : t list -> t
  val of_list : Elt.t list -> t
  val of_array : Elt.t array -> t
  val of_sorted_array : Elt.t array -> t Or_error.t
  val of_sorted_array_unchecked : Elt.t array -> t
  val stable_dedup_list : Elt.t list -> Elt.t list
  val map : ('a, 'b) Core_set.t -> f:('-> Elt.t) -> t
  val filter_map : ('a, 'b) Core_set.t -> f:('-> Elt.t option) -> t
  val of_tree : Tree.t -> t
  val t_of_sexp : Sexplib.Sexp.t -> t
  val sexp_of_t : t -> Sexplib.Sexp.t
  val compare : t -> t -> int
end