functor (Elt : Comparator.S->
  sig
    module Elt :
      sig
        type t = Elt.t
        val compare : t -> t -> int
        val t_of_sexp : Sexplib.Sexp.t -> t
        val sexp_of_t : t -> Sexplib.Sexp.t
        type comparator = Elt.comparator
        val comparator : (t, comparator) Comparator.t_
      end
    module Tree :
      sig
        type t = (Elt.t, Elt.comparator) 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) Tree.t -> f:('-> Elt.t) -> t
        val filter_map : ('a, 'b) 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) 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) t -> f:('-> Elt.t) -> t
    val filter_map : ('a, 'b) 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