functor
  (Bound : sig
             type t
             val ( >= ) : t -> t -> bool
             val ( <= ) : t -> t -> bool
             val ( = ) : t -> t -> bool
             val ( > ) : t -> t -> bool
             val ( < ) : t -> t -> bool
             val ( <> ) : t -> t -> bool
             val equal : t -> t -> bool
             val compare : t -> t -> int
             val min : t -> t -> t
             val max : t -> t -> t
             val ascending : t -> t -> int
             val descending : t -> t -> int
             val between : t -> low:t -> high:t -> bool
             module Replace_polymorphic_compare :
               sig
                 val ( >= ) : t -> t -> bool
                 val ( <= ) : t -> t -> bool
                 val ( = ) : t -> t -> bool
                 val ( > ) : t -> t -> bool
                 val ( < ) : t -> t -> bool
                 val ( <> ) : t -> t -> bool
                 val equal : t -> t -> bool
                 val compare : t -> t -> int
                 val min : t -> t -> t
                 val max : t -> t -> t
                 val _squelch_unused_module_warning_ : unit
               end
             type comparator
             val comparator : (t, comparator) Core_kernel.Comparator.t
             val validate_lbound :
               min:t Core_kernel.Comparable_intf.bound ->
               t Core_kernel.Validate.check
             val validate_ubound :
               max:t Core_kernel.Comparable_intf.bound ->
               t Core_kernel.Validate.check
             val validate_bound :
               min:t Core_kernel.Comparable_intf.bound ->
               max:t Core_kernel.Comparable_intf.bound ->
               t Core_kernel.Validate.check
             module Map :
               sig
                 module Key :
                   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) Core_kernel.Comparator.t_
                   end
                 module Tree :
                   sig
                     type 'a t =
                         (Key.t, 'a, Key.comparator)
                         Core_kernel.Core_map.Tree.t
                     val empty : 'a t
                     val singleton : Key.t -> '-> 'a t
                     val of_alist :
                       (Key.t * 'a) list ->
                       [ `Duplicate_key of Key.t | `Ok of 'a t ]
                     val of_alist_exn : (Key.t * 'a) list -> 'a t
                     val of_alist_multi : (Key.t * 'a) list -> 'a list t
                     val of_alist_fold :
                       (Key.t * 'a) list ->
                       init:'-> f:('-> '-> 'b) -> 'b t
                     val of_sorted_array :
                       (Key.t * 'a) array -> 'a t Core_kernel.Or_error.t
                     val of_sorted_array_unchecked :
                       (Key.t * 'a) array -> 'a t
                     val of_tree : 'a t -> 'a t
                     val invariants : 'a t -> bool
                     val is_empty : 'a t -> bool
                     val length : 'a t -> int
                     val add : 'a t -> key:Key.t -> data:'-> 'a t
                     val add_multi :
                       'a list t -> key:Key.t -> data:'-> 'a list t
                     val change :
                       'a t -> Key.t -> ('a option -> 'a option) -> 'a t
                     val find : 'a t -> Key.t -> 'a option
                     val find_exn : 'a t -> Key.t -> 'a
                     val remove : 'a t -> Key.t -> 'a t
                     val mem : 'a t -> Key.t -> bool
                     val iter :
                       'a t -> f:(key:Key.t -> data:'-> unit) -> unit
                     val iter2 :
                       'a t ->
                       'b t ->
                       f:(key:Key.t ->
                          data:[ `Both of 'a * 'b
                               | `Left of 'a
                               | `Right of 'b ] ->
                          unit) ->
                       unit
                     val map : 'a t -> f:('-> 'b) -> 'b t
                     val mapi :
                       'a t -> f:(key:Key.t -> data:'-> 'b) -> 'b t
                     val fold :
                       'a t ->
                       init:'-> f:(key:Key.t -> data:'-> '-> 'b) -> 'b
                     val fold_right :
                       'a t ->
                       init:'-> f:(key:Key.t -> data:'-> '-> 'b) -> 'b
                     val filter :
                       'a t -> f:(key:Key.t -> data:'-> bool) -> 'a t
                     val filter_map : 'a t -> f:('-> 'b option) -> 'b t
                     val filter_mapi :
                       'a t -> f:(key:Key.t -> data:'-> 'b option) -> 'b t
                     val compare_direct :
                       ('-> '-> int) -> 'a t -> 'a t -> int
                     val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
                     val keys : 'a t -> Key.t list
                     val data : 'a t -> 'a list
                     val to_alist : 'a t -> (Key.t * 'a) list
                     val validate :
                       name:(Key.t -> string) ->
                       'Core_kernel.Validate.check ->
                       'a t Core_kernel.Validate.check
                     val merge :
                       'a t ->
                       'b t ->
                       f:(key:Key.t ->
                          [ `Both of 'a * '| `Left of '| `Right of 'b ] ->
                          'c option) ->
                       'c t
                     val symmetric_diff :
                       'a t ->
                       'a t ->
                       data_equal:('-> '-> bool) ->
                       (Key.t *
                        [ `Left of '| `Right of '| `Unequal of 'a * 'a ])
                       list
                     val min_elt : 'a t -> (Key.t * 'a) option
                     val min_elt_exn : 'a t -> Key.t * 'a
                     val max_elt : 'a t -> (Key.t * 'a) option
                     val max_elt_exn : 'a t -> Key.t * 'a
                     val for_all : 'a t -> f:('-> bool) -> bool
                     val exists : 'a t -> f:('-> bool) -> bool
                     val fold_range_inclusive :
                       'a t ->
                       min:Key.t ->
                       max:Key.t ->
                       init:'-> f:(key:Key.t -> data:'-> '-> 'b) -> 'b
                     val range_to_alist :
                       'a t -> min:Key.t -> max:Key.t -> (Key.t * 'a) list
                     val prev_key : 'a t -> Key.t -> (Key.t * 'a) option
                     val next_key : 'a t -> Key.t -> (Key.t * 'a) option
                     val rank : 'a t -> Key.t -> int option
                     val to_tree : 'a t -> 'a t
                     val t_of_sexp :
                       (Sexplib.Sexp.t -> 'a) -> Sexplib.Sexp.t -> 'a t
                     val sexp_of_t :
                       ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
                   end
                 type 'a t =
                     (Key.t, 'a, Key.comparator) Core_kernel.Core_map.t
                 val empty : 'a t
                 val singleton : Key.t -> '-> 'a t
                 val of_alist :
                   (Key.t * 'a) list ->
                   [ `Duplicate_key of Key.t | `Ok of 'a t ]
                 val of_alist_exn : (Key.t * 'a) list -> 'a t
                 val of_alist_multi : (Key.t * 'a) list -> 'a list t
                 val of_alist_fold :
                   (Key.t * 'a) list -> init:'-> f:('-> '-> 'b) -> 'b t
                 val of_sorted_array :
                   (Key.t * 'a) array -> 'a t Core_kernel.Or_error.t
                 val of_sorted_array_unchecked : (Key.t * 'a) array -> 'a t
                 val of_tree : 'Tree.t -> 'a t
                 val invariants : 'a t -> bool
                 val is_empty : 'a t -> bool
                 val length : 'a t -> int
                 val add : 'a t -> key:Key.t -> data:'-> 'a t
                 val add_multi :
                   'a list t -> key:Key.t -> data:'-> 'a list t
                 val change :
                   'a t -> Key.t -> ('a option -> 'a option) -> 'a t
                 val find : 'a t -> Key.t -> 'a option
                 val find_exn : 'a t -> Key.t -> 'a
                 val remove : 'a t -> Key.t -> 'a t
                 val mem : 'a t -> Key.t -> bool
                 val iter : 'a t -> f:(key:Key.t -> data:'-> unit) -> unit
                 val iter2 :
                   'a t ->
                   'b t ->
                   f:(key:Key.t ->
                      data:[ `Both of 'a * '| `Left of '| `Right of 'b ] ->
                      unit) ->
                   unit
                 val map : 'a t -> f:('-> 'b) -> 'b t
                 val mapi : 'a t -> f:(key:Key.t -> data:'-> 'b) -> 'b t
                 val fold :
                   'a t ->
                   init:'-> f:(key:Key.t -> data:'-> '-> 'b) -> 'b
                 val fold_right :
                   'a t ->
                   init:'-> f:(key:Key.t -> data:'-> '-> 'b) -> 'b
                 val filter :
                   'a t -> f:(key:Key.t -> data:'-> bool) -> 'a t
                 val filter_map : 'a t -> f:('-> 'b option) -> 'b t
                 val filter_mapi :
                   'a t -> f:(key:Key.t -> data:'-> 'b option) -> 'b t
                 val compare_direct :
                   ('-> '-> int) -> 'a t -> 'a t -> int
                 val equal : ('-> '-> bool) -> 'a t -> 'a t -> bool
                 val keys : 'a t -> Key.t list
                 val data : 'a t -> 'a list
                 val to_alist : 'a t -> (Key.t * 'a) list
                 val validate :
                   name:(Key.t -> string) ->
                   'Core_kernel.Validate.check ->
                   'a t Core_kernel.Validate.check
                 val merge :
                   'a t ->
                   'b t ->
                   f:(key:Key.t ->
                      [ `Both of 'a * '| `Left of '| `Right of 'b ] ->
                      'c option) ->
                   'c t
                 val symmetric_diff :
                   'a t ->
                   'a t ->
                   data_equal:('-> '-> bool) ->
                   (Key.t *
                    [ `Left of '| `Right of '| `Unequal of 'a * 'a ])
                   list
                 val min_elt : 'a t -> (Key.t * 'a) option
                 val min_elt_exn : 'a t -> Key.t * 'a
                 val max_elt : 'a t -> (Key.t * 'a) option
                 val max_elt_exn : 'a t -> Key.t * 'a
                 val for_all : 'a t -> f:('-> bool) -> bool
                 val exists : 'a t -> f:('-> bool) -> bool
                 val fold_range_inclusive :
                   'a t ->
                   min:Key.t ->
                   max:Key.t ->
                   init:'-> f:(key:Key.t -> data:'-> '-> 'b) -> 'b
                 val range_to_alist :
                   'a t -> min:Key.t -> max:Key.t -> (Key.t * 'a) list
                 val prev_key : 'a t -> Key.t -> (Key.t * 'a) option
                 val next_key : 'a t -> Key.t -> (Key.t * 'a) option
                 val rank : 'a t -> Key.t -> int option
                 val to_tree : 'a t -> 'Tree.t
                 val t_of_sexp :
                   (Sexplib.Sexp.t -> 'a) -> Sexplib.Sexp.t -> 'a t
                 val sexp_of_t :
                   ('-> Sexplib.Sexp.t) -> 'a t -> Sexplib.Sexp.t
                 val compare : ('-> '-> int) -> 'a t -> 'a t -> int
               end
             module Set :
               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) Core_kernel.Comparator.t_
                   end
                 module Tree :
                   sig
                     type t =
                         (Elt.t, Elt.comparator) Core_kernel.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 Core_kernel.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_kernel.Core_set.Tree.t ->
                       f:('-> Elt.t) -> t
                     val filter_map :
                       ('a, 'b) Core_kernel.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_kernel.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 Core_kernel.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_kernel.Core_set.t -> f:('-> Elt.t) -> t
                 val filter_map :
                   ('a, 'b) Core_kernel.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
             val t_of_sexp : Sexplib.Sexp.t -> Interval.Make.t
             val sexp_of_t : Interval.Make.t -> Sexplib.Sexp.t
             val bin_t :
               Interval.Make.t Core_kernel.Std.Bin_prot.Type_class.t
             val bin_read_t :
               Interval.Make.t Core_kernel.Std.Bin_prot.Read_ml.reader
             val bin_read_t_ :
               Interval.Make.t Core_kernel.Std.Bin_prot.Unsafe_read_c.reader
             val bin_read_t__ :
               (int -> Interval.Make.t)
               Core_kernel.Std.Bin_prot.Unsafe_read_c.reader
             val bin_reader_t :
               Interval.Make.t Core_kernel.Std.Bin_prot.Type_class.reader
             val bin_size_t :
               Interval.Make.t Core_kernel.Std.Bin_prot.Size.sizer
             val bin_write_t :
               Interval.Make.t Core_kernel.Std.Bin_prot.Write_ml.writer
             val bin_write_t_ :
               Interval.Make.t Core_kernel.Std.Bin_prot.Unsafe_write_c.writer
             val bin_writer_t :
               Interval.Make.t Core_kernel.Std.Bin_prot.Type_class.writer
           end->
  sig
    type t
    type bound = Bound.t
    type 'a t_ = t
    type 'a bound_ = bound
    val empty : 'a t_
    val intersect : 'a t_ -> 'a t_ -> 'a t_
    val is_empty : 'a t_ -> bool
    val is_empty_or_singleton : 'a t_ -> bool
    val bounds : 'a t_ -> ('a bound_ * 'a bound_) option
    val lbound : 'a t_ -> 'a bound_ option
    val ubound : 'a t_ -> 'a bound_ option
    val bounds_exn : 'a t_ -> 'a bound_ * 'a bound_
    val lbound_exn : 'a t_ -> 'a bound_
    val ubound_exn : 'a t_ -> 'a bound_
    val contains : 'a t_ -> 'a bound_ -> bool
    val compare_value :
      'a t_ ->
      'a bound_ -> [ `Above | `Below | `Interval_is_empty | `Within ]
    val bound : 'a t_ -> 'a bound_ -> 'a bound_ option
    val is_superset : 'a t_ -> of_:'a t_ -> bool
    val is_subset : 'a t_ -> of_:'a t_ -> bool
    val map : 'a t_ -> f:('a bound_ -> 'b bound_) -> 'b t_
    val are_disjoint : 'a t_ list -> bool
    val are_disjoint_as_open_intervals : 'a t_ list -> bool
    val list_intersect : 'a t_ list -> 'a t_ list -> 'a t_ list
    val half_open_intervals_are_a_partition : 'a t_ list -> bool
    val create : bound -> bound -> t
    val to_poly : t -> bound t
    module Set :
      sig
        type t
        type 'a t_ = t
        val create : ('a bound_ * 'a bound_) list -> 'a t_
        val create_from_intervals : 'a t_ list -> 'a t_
        val contains : 'a t_ -> 'a bound_ -> bool
        val contains_set : container:'a t_ -> contained:'a t_ -> bool
        val ubound_exn : 'a t_ -> 'a bound_
        val lbound_exn : 'a t_ -> 'a bound_
        val ubound : 'a t_ -> 'a bound_ option
        val lbound : 'a t_ -> 'a bound_ option
        val to_poly : t -> bound Set.t
        val t_of_sexp : Sexplib.Sexp.t -> t
        val sexp_of_t : t -> Sexplib.Sexp.t
        val bin_t : t Bin_prot.Type_class.t
        val bin_read_t : t Bin_prot.Read_ml.reader
        val bin_read_t_ : t Bin_prot.Unsafe_read_c.reader
        val bin_read_t__ : (int -> t) Bin_prot.Unsafe_read_c.reader
        val bin_reader_t : t Bin_prot.Type_class.reader
        val bin_size_t : t Bin_prot.Size.sizer
        val bin_write_t : t Bin_prot.Write_ml.writer
        val bin_write_t_ : t Bin_prot.Unsafe_write_c.writer
        val bin_writer_t : t Bin_prot.Type_class.writer
      end
    val t_of_sexp : Sexplib.Sexp.t -> t
    val sexp_of_t : t -> Sexplib.Sexp.t
    val bin_t : t Bin_prot.Type_class.t
    val bin_read_t : t Bin_prot.Read_ml.reader
    val bin_read_t_ : t Bin_prot.Unsafe_read_c.reader
    val bin_read_t__ : (int -> t) Bin_prot.Unsafe_read_c.reader
    val bin_reader_t : t Bin_prot.Type_class.reader
    val bin_size_t : t Bin_prot.Size.sizer
    val bin_write_t : t Bin_prot.Write_ml.writer
    val bin_write_t_ : t Bin_prot.Unsafe_write_c.writer
    val bin_writer_t : t Bin_prot.Type_class.writer
  end