sig
  val __pa_ounit_275876e34cf609db118f3d84b799a790 : string
  module Binable :
    sig
      val __pa_ounit_275876e34cf609db118f3d84b799a790 : string
      module type S =
        sig
          type t
          val bin_size_t : t Bin_prot.Size.sizer
          val bin_write_t : t Bin_prot.Map_to_safe.writer
          val bin_write_t_ : t Bin_prot.Unsafe_write_c.writer
          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_writer_t : t Bin_prot.Type_class.writer
          val bin_reader_t : t Bin_prot.Type_class.reader
          val bin_t : t Bin_prot.Type_class.t
        end
      module type S1 =
        sig
          type 'a t
          val bin_size_t : ('a, 'a t) Bin_prot.Size.sizer1
          val bin_write_t : ('a, 'a t) Bin_prot.Map_to_safe.writer1
          val bin_write_t_ : ('a, 'a t) Bin_prot.Unsafe_write_c.writer1
          val bin_read_t : ('a, 'a t) Bin_prot.Map_to_safe.reader1
          val bin_read_t_ : ('a, 'a t) Bin_prot.Unsafe_read_c.reader1
          val bin_read_t__ : ('a, int -> 'a t) Bin_prot.Unsafe_read_c.reader1
          val bin_writer_t : ('a, 'a t) Bin_prot.Type_class.S1.writer
          val bin_reader_t : ('a, 'a t) Bin_prot.Type_class.S1.reader
          val bin_t : ('a, 'a t) Bin_prot.Type_class.S1.t
        end
      module type S2 =
        sig
          type ('a, 'b) t
          val bin_size_t : ('a, 'b, ('a, 'b) t) Bin_prot.Size.sizer2
          val bin_write_t : ('a, 'b, ('a, 'b) t) Bin_prot.Map_to_safe.writer2
          val bin_write_t_ :
            ('a, 'b, ('a, 'b) t) Bin_prot.Unsafe_write_c.writer2
          val bin_read_t : ('a, 'b, ('a, 'b) t) Bin_prot.Map_to_safe.reader2
          val bin_read_t_ :
            ('a, 'b, ('a, 'b) t) Bin_prot.Unsafe_read_c.reader2
          val bin_read_t__ :
            ('a, 'b, int -> ('a, 'b) t) Bin_prot.Unsafe_read_c.reader2
          val bin_writer_t :
            ('a, 'b, ('a, 'b) t) Bin_prot.Type_class.S2.writer
          val bin_reader_t :
            ('a, 'b, ('a, 'b) t) Bin_prot.Type_class.S2.reader
          val bin_t : ('a, 'b, ('a, 'b) t) Bin_prot.Type_class.S2.t
        end
      module List :
        sig
          val length : 'a list -> int
          val hd : 'a list -> 'a
          val tl : 'a list -> 'a list
          val nth : 'a list -> int -> 'a
          val rev : 'a list -> 'a list
          val append : 'a list -> 'a list -> 'a list
          val rev_append : 'a list -> 'a list -> 'a list
          val concat : 'a list list -> 'a list
          val flatten : 'a list list -> 'a list
          val iter : f:('-> unit) -> 'a list -> unit
          val iteri : f:(int -> '-> unit) -> 'a list -> unit
          val map : f:('-> 'b) -> 'a list -> 'b list
          val mapi : f:(int -> '-> 'b) -> 'a list -> 'b list
          val rev_map : f:('-> 'b) -> 'a list -> 'b list
          val fold_left : f:('-> '-> 'a) -> init:'-> 'b list -> 'a
          val fold_right : f:('-> '-> 'b) -> 'a list -> init:'-> 'b
          val iter2 : f:('-> '-> unit) -> 'a list -> 'b list -> unit
          val map2 : f:('-> '-> 'c) -> 'a list -> 'b list -> 'c list
          val rev_map2 : f:('-> '-> 'c) -> 'a list -> 'b list -> 'c list
          val fold_left2 :
            f:('-> '-> '-> 'a) -> init:'-> 'b list -> 'c list -> 'a
          val fold_right2 :
            f:('-> '-> '-> 'c) -> 'a list -> 'b list -> init:'-> 'c
          val for_all : f:('-> bool) -> 'a list -> bool
          val exists : f:('-> bool) -> 'a list -> bool
          val for_all2 : f:('-> '-> bool) -> 'a list -> 'b list -> bool
          val exists2 : f:('-> '-> bool) -> 'a list -> 'b list -> bool
          val mem : '-> set:'a list -> bool
          val memq : '-> set:'a list -> bool
          val find : f:('-> bool) -> 'a list -> 'a
          val filter : f:('-> bool) -> 'a list -> 'a list
          val find_all : f:('-> bool) -> 'a list -> 'a list
          val partition : f:('-> bool) -> 'a list -> 'a list * 'a list
          val assoc : '-> ('a * 'b) list -> 'b
          val assq : '-> ('a * 'b) list -> 'b
          val mem_assoc : '-> map:('a * 'b) list -> bool
          val mem_assq : '-> map:('a * 'b) list -> bool
          val remove_assoc : '-> ('a * 'b) list -> ('a * 'b) list
          val remove_assq : '-> ('a * 'b) list -> ('a * 'b) list
          val split : ('a * 'b) list -> 'a list * 'b list
          val combine : 'a list -> 'b list -> ('a * 'b) list
          val sort : cmp:('-> '-> int) -> 'a list -> 'a list
          val stable_sort : cmp:('-> '-> int) -> 'a list -> 'a list
          val fast_sort : cmp:('-> '-> int) -> 'a list -> 'a list
          val merge : cmp:('-> '-> int) -> 'a list -> 'a list -> 'a list
        end
      module Of_stringable :
        functor (M : Stringable.S->
          sig
            val bin_size_t : M.t Bin_prot.Size.sizer
            val bin_write_t : M.t Bin_prot.Map_to_safe.writer
            val bin_write_t_ : M.t Bin_prot.Unsafe_write_c.writer
            val bin_read_t : M.t Bin_prot.Read_ml.reader
            val bin_read_t_ : M.t Bin_prot.Unsafe_read_c.reader
            val bin_read_t__ : (int -> M.t) Bin_prot.Unsafe_read_c.reader
            val bin_writer_t : M.t Bin_prot.Type_class.writer
            val bin_reader_t : M.t Bin_prot.Type_class.reader
            val bin_t : M.t Bin_prot.Type_class.t
          end
      type bigstring =
          (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
          Bigarray.Array1.t
      type 'a m = (module S with type t = 'a)
      val of_bigstring :
        (module S with type t = 'a) -> Bin_prot.Common.buf -> 'a
      val create_bigstring :
        int ->
        (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
        Bigarray.Array1.t
      val to_bigstring :
        ?prefix_with_length:bool ->
        (module S with type t = 'a) ->
        '->
        (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout)
        Bigarray.Array1.t
    end
  module type S =
    sig
      type t
      type outer = t
      val of_float : float -> outer
      val to_float : outer -> float
      val of_string : string -> outer
      val to_string : outer -> string
      module Hashable : sig type t = outer end
      val hash : outer -> int
      val hashable : outer Hashable.Hashtbl.Hashable.t
      module Table :
        sig
          type key = outer
          type ('a, 'b) hashtbl = ('a, 'b) Hashable.Hashtbl.t
          type 'b t = (key, 'b) hashtbl
          type ('a, 'b) t_ = 'b t
          type 'a key_ = key
          val hashable : key Core_hashtbl_intf.Hashable.t
          val create :
            ('a key_, unit -> ('a, 'b) t_)
            Core_hashtbl_intf.create_options_without_hashable
          val of_alist :
            ('a key_,
             ('a key_ * 'b) list ->
             [ `Duplicate_key of 'a key_ | `Ok of ('a, 'b) t_ ])
            Core_hashtbl_intf.create_options_without_hashable
          val of_alist_report_all_dups :
            ('a key_,
             ('a key_ * 'b) list ->
             [ `Duplicate_keys of 'a key_ list | `Ok of ('a, 'b) t_ ])
            Core_hashtbl_intf.create_options_without_hashable
          val of_alist_exn :
            ('a key_, ('a key_ * 'b) list -> ('a, 'b) t_)
            Core_hashtbl_intf.create_options_without_hashable
          val of_alist_multi :
            ('a key_, ('a key_ * 'b) list -> ('a, 'b list) t_)
            Core_hashtbl_intf.create_options_without_hashable
          val create_mapped :
            ('a key_,
             get_key:('-> 'a key_) ->
             get_data:('-> 'b) ->
             'r list ->
             [ `Duplicate_keys of 'a key_ list | `Ok of ('a, 'b) t_ ])
            Core_hashtbl_intf.create_options_without_hashable
          val create_with_key :
            ('a key_,
             get_key:('-> 'a key_) ->
             'r list ->
             [ `Duplicate_keys of 'a key_ list | `Ok of ('a, 'r) t_ ])
            Core_hashtbl_intf.create_options_without_hashable
          val create_with_key_exn :
            ('a key_, get_key:('-> 'a key_) -> 'r list -> ('a, 'r) t_)
            Core_hashtbl_intf.create_options_without_hashable
          val group :
            ('a key_,
             get_key:('-> 'a key_) ->
             get_data:('-> 'b) ->
             combine:('-> '-> 'b) -> 'r list -> ('a, 'b) t_)
            Core_hashtbl_intf.create_options_without_hashable
          val sexp_of_key : ('a, 'b) t_ -> 'a key_ -> Sexplib.Sexp.t
          val clear : ('a, 'b) t_ -> unit
          val copy : ('a, 'b) t_ -> ('a, 'b) t_
          val invariant : ('a, 'b) t_ -> unit
          val fold :
            ('a, 'b) t_ ->
            init:'-> f:(key:'a key_ -> data:'-> '-> 'c) -> 'c
          val iter :
            ('a, 'b) t_ -> f:(key:'a key_ -> data:'-> unit) -> unit
          val existsi :
            ('a, 'b) t_ -> f:(key:'a key_ -> data:'-> bool) -> bool
          val exists : ('a, 'b) t_ -> f:('-> bool) -> bool
          val length : ('a, 'b) t_ -> int
          val is_empty : ('a, 'b) t_ -> bool
          val mem : ('a, 'b) t_ -> 'a key_ -> bool
          val remove : ('a, 'b) t_ -> 'a key_ -> unit
          val remove_one : ('a, 'b list) t_ -> 'a key_ -> unit
          val replace : ('a, 'b) t_ -> key:'a key_ -> data:'-> unit
          val set : ('a, 'b) t_ -> key:'a key_ -> data:'-> unit
          val add :
            ('a, 'b) t_ -> key:'a key_ -> data:'-> [ `Duplicate | `Ok ]
          val add_exn : ('a, 'b) t_ -> key:'a key_ -> data:'-> unit
          val change :
            ('a, 'b) t_ -> 'a key_ -> ('b option -> 'b option) -> unit
          val add_multi : ('a, 'b list) t_ -> key:'a key_ -> data:'-> unit
          val remove_multi : ('a, 'b list) t_ -> 'a key_ -> unit
          val map : ('a, 'b) t_ -> f:('-> 'c) -> ('a, 'c) t_
          val mapi :
            ('a, 'b) t_ -> f:(key:'a key_ -> data:'-> 'c) -> ('a, 'c) t_
          val filter_map : ('a, 'b) t_ -> f:('-> 'c option) -> ('a, 'c) t_
          val filter_mapi :
            ('a, 'b) t_ ->
            f:(key:'a key_ -> data:'-> 'c option) -> ('a, 'c) t_
          val filter : ('a, 'b) t_ -> f:('-> bool) -> ('a, 'b) t_
          val filteri :
            ('a, 'b) t_ -> f:(key:'a key_ -> data:'-> bool) -> ('a, 'b) t_
          val partition_map :
            ('a, 'b) t_ ->
            f:('-> [ `Fst of '| `Snd of 'd ]) ->
            ('a, 'c) t_ * ('a, 'd) t_
          val partition_mapi :
            ('a, 'b) t_ ->
            f:(key:'a key_ -> data:'-> [ `Fst of '| `Snd of 'd ]) ->
            ('a, 'c) t_ * ('a, 'd) t_
          val partition_tf :
            ('a, 'b) t_ -> f:('-> bool) -> ('a, 'b) t_ * ('a, 'b) t_
          val partitioni_tf :
            ('a, 'b) t_ ->
            f:(key:'a key_ -> data:'-> bool) -> ('a, 'b) t_ * ('a, 'b) t_
          val find_or_add :
            ('a, 'b) t_ -> 'a key_ -> default:(unit -> 'b) -> 'b
          val find : ('a, 'b) t_ -> 'a key_ -> 'b option
          val find_exn : ('a, 'b) t_ -> 'a key_ -> 'b
          val find_and_remove : ('a, 'b) t_ -> 'a key_ -> 'b option
          val iter_vals : ('a, 'b) t_ -> f:('-> unit) -> unit
          val merge :
            ('k, 'a) t_ ->
            ('k, 'b) t_ ->
            f:(key:'k key_ ->
               [ `Both of 'a * '| `Left of '| `Right of 'b ] -> 'c option) ->
            ('k, 'c) t_
          val merge_into :
            f:(key:'a key_ -> '-> 'b option -> 'b option) ->
            src:('a, 'b) t_ -> dst:('a, 'b) t_ -> unit
          val keys : ('a, 'b) t_ -> 'a key_ list
          val data : ('a, 'b) t_ -> 'b list
          val filter_inplace : ('a, 'b) t_ -> f:('-> bool) -> unit
          val filteri_inplace :
            ('a, 'b) t_ -> f:('a key_ -> '-> bool) -> unit
          val equal :
            ('a, 'b) t_ -> ('a, 'b) t_ -> ('-> '-> bool) -> bool
          val to_alist : ('a, 'b) t_ -> ('a key_ * 'b) list
          val validate :
            name:('a key_ -> string) ->
            'Validate.check -> ('a, 'b) t_ Validate.check
          val incr : ?by:int -> ('a, int) t_ -> 'a key_ -> unit
          val t_of_sexp : (Sexplib.Sexp.t -> 'b) -> Sexplib.Sexp.t -> 'b t
          val sexp_of_t : ('-> Sexplib.Sexp.t) -> 'b t -> Sexplib.Sexp.t
          val bin_size_t : ('a, 'a t) Bin_prot.Size.sizer1
          val bin_write_t : ('a, 'a t) Bin_prot.Map_to_safe.writer1
          val bin_write_t_ : ('a, 'a t) Bin_prot.Unsafe_write_c.writer1
          val bin_read_t : ('a, 'a t) Bin_prot.Map_to_safe.reader1
          val bin_read_t_ : ('a, 'a t) Bin_prot.Unsafe_read_c.reader1
          val bin_read_t__ : ('a, int -> 'a t) Bin_prot.Unsafe_read_c.reader1
          val bin_writer_t : ('a, 'a t) Bin_prot.Type_class.S1.writer
          val bin_reader_t : ('a, 'a t) Bin_prot.Type_class.S1.reader
          val bin_t : ('a, 'a t) Bin_prot.Type_class.S1.t
        end
      module Hash_set :
        sig
          type elt = outer
          type 'a hash_set = 'Hash_set.t
          type t = elt hash_set
          type 'a t_ = t
          type 'a elt_ = elt
          val create :
            ('a, unit -> 'a t_) Hash_set_intf.create_options_without_hashable
          val of_list :
            ('a, 'a elt_ list -> 'a t_)
            Hash_set_intf.create_options_without_hashable
          val t_of_sexp : Sexplib.Sexp.t -> t
          val sexp_of_t : t -> Sexplib.Sexp.t
          val bin_size_t : t Bin_prot.Size.sizer
          val bin_write_t : t Bin_prot.Map_to_safe.writer
          val bin_write_t_ : t Bin_prot.Unsafe_write_c.writer
          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_writer_t : t Bin_prot.Type_class.writer
          val bin_reader_t : t Bin_prot.Type_class.reader
          val bin_t : t Bin_prot.Type_class.t
        end
      module Hash_queue :
        sig
          module Key :
            sig
              type t = outer
              val compare : t -> t -> int
              val hash : t -> int
              val t_of_sexp : Sexplib.Sexp.t -> t
              val sexp_of_t : t -> Sexplib.Sexp.t
            end
          type 'a t
          val length : 'a t -> int
          val is_empty : 'a t -> bool
          val iter : 'a t -> f:('-> unit) -> unit
          val fold :
            'a t -> init:'accum -> f:('accum -> '-> 'accum) -> 'accum
          val exists : 'a t -> f:('-> bool) -> bool
          val for_all : 'a t -> f:('-> bool) -> bool
          val count : 'a t -> f:('-> bool) -> int
          val find : 'a t -> f:('-> bool) -> 'a option
          val find_map : 'a t -> f:('-> 'b option) -> 'b option
          val to_list : 'a t -> 'a list
          val to_array : 'a t -> 'a array
          val invariant : 'a t -> unit
          val create : unit -> 'a t
          val clear : 'a t -> unit
          val mem : 'a t -> outer -> bool
          val lookup : 'a t -> outer -> 'a option
          val lookup_exn : 'a t -> outer -> 'a
          val enqueue : 'a t -> outer -> '-> [ `Key_already_present | `Ok ]
          val enqueue_exn : 'a t -> outer -> '-> unit
          val first : 'a t -> 'a option
          val keys : 'a t -> outer list
          val dequeue : 'a t -> 'a option
          val dequeue_exn : 'a t -> 'a
          val dequeue_with_key : 'a t -> (outer * 'a) option
          val dequeue_with_key_exn : 'a t -> outer * 'a
          val dequeue_all : 'a t -> f:('-> unit) -> unit
          val remove : 'a t -> outer -> [ `No_such_key | `Ok ]
          val remove_exn : 'a t -> outer -> unit
          val replace : 'a t -> outer -> '-> [ `No_such_key | `Ok ]
          val replace_exn : 'a t -> outer -> '-> unit
          val iteri : 'a t -> f:(key:outer -> data:'-> unit) -> unit
          val foldi :
            'a t -> init:'-> f:('-> key:outer -> data:'-> 'b) -> 'b
        end
      module Hash_heap :
        sig
          module Key :
            sig
              type t = outer
              val compare : t -> t -> int
              val hash : t -> int
              val t_of_sexp : Sexplib.Sexp.t -> t
              val sexp_of_t : t -> Sexplib.Sexp.t
            end
          type 'a t
          val create : ?min_size:int -> ('-> '-> int) -> 'a t
          val copy : 'a t -> 'a t
          val push :
            'a t -> key:outer -> data:'-> [ `Key_already_present | `Ok ]
          val push_exn : 'a t -> key:outer -> data:'-> unit
          val replace : 'a t -> key:outer -> data:'-> unit
          val remove : 'a t -> outer -> unit
          val mem : 'a t -> outer -> bool
          val top : 'a t -> 'a option
          val top_exn : 'a t -> 'a
          val top_with_key : 'a t -> (outer * 'a) option
          val top_with_key_exn : 'a t -> outer * 'a
          val pop_with_key : 'a t -> (outer * 'a) option
          val pop_with_key_exn : 'a t -> outer * 'a
          val pop : 'a t -> 'a option
          val pop_exn : 'a t -> 'a
          val cond_pop_with_key :
            'a t -> (key:outer -> data:'-> bool) -> (outer * 'a) option
          val cond_pop : 'a t -> ('-> bool) -> 'a option
          val find : 'a t -> outer -> 'a option
          val find_pop : 'a t -> outer -> 'a option
          val find_exn : 'a t -> outer -> 'a
          val find_pop_exn : 'a t -> outer -> 'a
          val iter : 'a t -> f:(key:outer -> data:'-> unit) -> unit
          val iter_vals : 'a t -> f:('-> unit) -> unit
          val length : 'a t -> int
        end
      val ( >= ) : outer -> outer -> bool
      val ( <= ) : outer -> outer -> bool
      val ( = ) : outer -> outer -> bool
      val ( > ) : outer -> outer -> bool
      val ( < ) : outer -> outer -> bool
      val ( <> ) : outer -> outer -> bool
      val equal : outer -> outer -> bool
      val min : outer -> outer -> outer
      val max : outer -> outer -> outer
      val ascending : outer -> outer -> int
      val descending : outer -> outer -> int
      val between : outer -> low:outer -> high:outer -> bool
      module Replace_polymorphic_compare :
        sig
          val ( >= ) : outer -> outer -> bool
          val ( <= ) : outer -> outer -> bool
          val ( = ) : outer -> outer -> bool
          val ( > ) : outer -> outer -> bool
          val ( < ) : outer -> outer -> bool
          val ( <> ) : outer -> outer -> bool
          val equal : outer -> outer -> bool
          val compare : outer -> outer -> int
          val min : outer -> outer -> outer
          val max : outer -> outer -> outer
          val _squelch_unused_module_warning_ : unit
        end
      type comparator
      val validate_lbound :
        min:outer Comparable_intf.bound -> outer Validate.check
      val validate_ubound :
        max:outer Comparable_intf.bound -> outer Validate.check
      val validate_bound :
        min:outer Comparable_intf.bound ->
        max:outer Comparable_intf.bound -> outer Validate.check
      val compare : outer -> outer -> int
      val t_of_sexp : Sexplib.Sexp.t -> outer
      val sexp_of_t : outer -> Sexplib.Sexp.t
      val bin_t : outer Bin_prot.Type_class.t
      val bin_read_t : outer Bin_prot.Read_ml.reader
      val bin_read_t_ : outer Bin_prot.Unsafe_read_c.reader
      val bin_read_t__ : (int -> outer) Bin_prot.Unsafe_read_c.reader
      val bin_reader_t : outer Bin_prot.Type_class.reader
      val bin_size_t : outer Bin_prot.Size.sizer
      val bin_write_t : outer Bin_prot.Write_ml.writer
      val bin_write_t_ : outer Bin_prot.Unsafe_write_c.writer
      val bin_writer_t : outer Bin_prot.Type_class.writer
      val comparator : (outer, comparator) Comparator.t_
      module Map :
        sig
          module Key :
            sig
              type t = outer
              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 'a t = (outer, 'a, comparator) Map.Tree.t
              val empty : 'a t
              val singleton : outer -> '-> 'a t
              val of_alist :
                (outer * 'a) list ->
                [ `Duplicate_key of outer | `Ok of 'a t ]
              val of_alist_exn : (outer * 'a) list -> 'a t
              val of_alist_multi : (outer * 'a) list -> 'a list t
              val of_alist_fold :
                (outer * 'a) list -> init:'-> f:('-> '-> 'b) -> 'b t
              val of_sorted_array : (outer * 'a) array -> 'a t Or_error.t
              val of_sorted_array_unchecked : (outer * '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:outer -> data:'-> 'a t
              val add_multi : 'a list t -> key:outer -> data:'-> 'a list t
              val change : 'a t -> outer -> ('a option -> 'a option) -> 'a t
              val find : 'a t -> outer -> 'a option
              val find_exn : 'a t -> outer -> 'a
              val remove : 'a t -> outer -> 'a t
              val mem : 'a t -> outer -> bool
              val iter : 'a t -> f:(key:outer -> data:'-> unit) -> unit
              val iter2 :
                'a t ->
                'b t ->
                f:(key:outer ->
                   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:outer -> data:'-> 'b) -> 'b t
              val fold :
                'a t -> init:'-> f:(key:outer -> data:'-> '-> 'b) -> 'b
              val fold_right :
                'a t -> init:'-> f:(key:outer -> data:'-> '-> 'b) -> 'b
              val filter : 'a t -> f:(key:outer -> data:'-> bool) -> 'a t
              val filter_map : 'a t -> f:('-> 'b option) -> 'b t
              val filter_mapi :
                'a t -> f:(key:outer -> 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 -> outer list
              val data : 'a t -> 'a list
              val to_alist : 'a t -> (outer * 'a) list
              val validate :
                name:(outer -> string) ->
                'Validate.check -> 'a t Validate.check
              val merge :
                'a t ->
                'b t ->
                f:(key:outer ->
                   [ `Both of 'a * '| `Left of '| `Right of 'b ] ->
                   'c option) ->
                'c t
              val symmetric_diff :
                'a t ->
                'a t ->
                data_equal:('-> '-> bool) ->
                (outer * [ `Left of '| `Right of '| `Unequal of 'a * 'a ])
                list
              val min_elt : 'a t -> (outer * 'a) option
              val min_elt_exn : 'a t -> outer * 'a
              val max_elt : 'a t -> (outer * 'a) option
              val max_elt_exn : 'a t -> outer * 'a
              val for_all : 'a t -> f:('-> bool) -> bool
              val exists : 'a t -> f:('-> bool) -> bool
              val fold_range_inclusive :
                'a t ->
                min:outer ->
                max:outer ->
                init:'-> f:(key:outer -> data:'-> '-> 'b) -> 'b
              val range_to_alist :
                'a t -> min:outer -> max:outer -> (outer * 'a) list
              val prev_key : 'a t -> outer -> (outer * 'a) option
              val next_key : 'a t -> outer -> (outer * 'a) option
              val rank : 'a t -> outer -> 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 = (outer, 'a, comparator) Map.t
          val empty : 'a t
          val singleton : outer -> '-> 'a t
          val of_alist :
            (outer * 'a) list -> [ `Duplicate_key of outer | `Ok of 'a t ]
          val of_alist_exn : (outer * 'a) list -> 'a t
          val of_alist_multi : (outer * 'a) list -> 'a list t
          val of_alist_fold :
            (outer * 'a) list -> init:'-> f:('-> '-> 'b) -> 'b t
          val of_sorted_array : (outer * 'a) array -> 'a t Or_error.t
          val of_sorted_array_unchecked : (outer * '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:outer -> data:'-> 'a t
          val add_multi : 'a list t -> key:outer -> data:'-> 'a list t
          val change : 'a t -> outer -> ('a option -> 'a option) -> 'a t
          val find : 'a t -> outer -> 'a option
          val find_exn : 'a t -> outer -> 'a
          val remove : 'a t -> outer -> 'a t
          val mem : 'a t -> outer -> bool
          val iter : 'a t -> f:(key:outer -> data:'-> unit) -> unit
          val iter2 :
            'a t ->
            'b t ->
            f:(key:outer ->
               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:outer -> data:'-> 'b) -> 'b t
          val fold :
            'a t -> init:'-> f:(key:outer -> data:'-> '-> 'b) -> 'b
          val fold_right :
            'a t -> init:'-> f:(key:outer -> data:'-> '-> 'b) -> 'b
          val filter : 'a t -> f:(key:outer -> data:'-> bool) -> 'a t
          val filter_map : 'a t -> f:('-> 'b option) -> 'b t
          val filter_mapi :
            'a t -> f:(key:outer -> 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 -> outer list
          val data : 'a t -> 'a list
          val to_alist : 'a t -> (outer * 'a) list
          val validate :
            name:(outer -> string) ->
            'Validate.check -> 'a t Validate.check
          val merge :
            'a t ->
            'b t ->
            f:(key:outer ->
               [ `Both of 'a * '| `Left of '| `Right of 'b ] -> 'c option) ->
            'c t
          val symmetric_diff :
            'a t ->
            'a t ->
            data_equal:('-> '-> bool) ->
            (outer * [ `Left of '| `Right of '| `Unequal of 'a * 'a ])
            list
          val min_elt : 'a t -> (outer * 'a) option
          val min_elt_exn : 'a t -> outer * 'a
          val max_elt : 'a t -> (outer * 'a) option
          val max_elt_exn : 'a t -> outer * 'a
          val for_all : 'a t -> f:('-> bool) -> bool
          val exists : 'a t -> f:('-> bool) -> bool
          val fold_range_inclusive :
            'a t ->
            min:outer ->
            max:outer ->
            init:'-> f:(key:outer -> data:'-> '-> 'b) -> 'b
          val range_to_alist :
            'a t -> min:outer -> max:outer -> (outer * 'a) list
          val prev_key : 'a t -> outer -> (outer * 'a) option
          val next_key : 'a t -> outer -> (outer * 'a) option
          val rank : 'a t -> outer -> 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
          val bin_size_t : ('a, 'a t) Bin_prot.Size.sizer1
          val bin_write_t : ('a, 'a t) Bin_prot.Map_to_safe.writer1
          val bin_write_t_ : ('a, 'a t) Bin_prot.Unsafe_write_c.writer1
          val bin_read_t : ('a, 'a t) Bin_prot.Map_to_safe.reader1
          val bin_read_t_ : ('a, 'a t) Bin_prot.Unsafe_read_c.reader1
          val bin_read_t__ : ('a, int -> 'a t) Bin_prot.Unsafe_read_c.reader1
          val bin_writer_t : ('a, 'a t) Bin_prot.Type_class.S1.writer
          val bin_reader_t : ('a, 'a t) Bin_prot.Type_class.S1.reader
          val bin_t : ('a, 'a t) Bin_prot.Type_class.S1.t
        end
      module Set :
        sig
          module Elt :
            sig
              type t = outer
              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 = (outer, comparator) Set.Tree.t
              val length : t -> int
              val is_empty : t -> bool
              val iter : t -> f:(outer -> unit) -> unit
              val fold :
                t -> init:'accum -> f:('accum -> outer -> 'accum) -> 'accum
              val exists : t -> f:(outer -> bool) -> bool
              val for_all : t -> f:(outer -> bool) -> bool
              val count : t -> f:(outer -> bool) -> int
              val find : t -> f:(outer -> bool) -> outer option
              val find_map : t -> f:(outer -> 'a option) -> 'a option
              val to_list : t -> outer list
              val to_array : t -> outer array
              val invariants : t -> bool
              val mem : t -> outer -> bool
              val add : t -> outer -> t
              val remove : t -> outer -> 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:('-> outer -> [ `Continue of '| `Stop of 'b ]) -> 'b
              val fold_right : t -> init:'-> f:(outer -> '-> 'b) -> 'b
              val iter2 :
                t ->
                t ->
                f:([ `Both of outer * outer
                   | `Left of outer
                   | `Right of outer ] -> unit) ->
                unit
              val filter : t -> f:(outer -> bool) -> t
              val partition_tf : t -> f:(outer -> bool) -> t * t
              val elements : t -> outer list
              val min_elt : t -> outer option
              val min_elt_exn : t -> outer
              val max_elt : t -> outer option
              val max_elt_exn : t -> outer
              val choose : t -> outer option
              val choose_exn : t -> outer
              val split : t -> outer -> t * bool * t
              val group_by : t -> equiv:(outer -> outer -> bool) -> t list
              val find_exn : t -> f:(outer -> bool) -> outer
              val find_index : t -> int -> outer option
              val remove_index : t -> int -> t
              val to_tree : t -> t
              val empty : t
              val singleton : outer -> t
              val union_list : t list -> t
              val of_list : outer list -> t
              val of_array : outer array -> t
              val of_sorted_array : outer array -> t Or_error.t
              val of_sorted_array_unchecked : outer array -> t
              val stable_dedup_list : outer list -> outer list
              val map : ('a, 'b) Set.Tree.t -> f:('-> outer) -> t
              val filter_map :
                ('a, 'b) Set.Tree.t -> f:('-> outer 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 = (outer, comparator) Set.t
          val length : t -> int
          val is_empty : t -> bool
          val iter : t -> f:(outer -> unit) -> unit
          val fold :
            t -> init:'accum -> f:('accum -> outer -> 'accum) -> 'accum
          val exists : t -> f:(outer -> bool) -> bool
          val for_all : t -> f:(outer -> bool) -> bool
          val count : t -> f:(outer -> bool) -> int
          val find : t -> f:(outer -> bool) -> outer option
          val find_map : t -> f:(outer -> 'a option) -> 'a option
          val to_list : t -> outer list
          val to_array : t -> outer array
          val invariants : t -> bool
          val mem : t -> outer -> bool
          val add : t -> outer -> t
          val remove : t -> outer -> 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:('-> outer -> [ `Continue of '| `Stop of 'b ]) -> 'b
          val fold_right : t -> init:'-> f:(outer -> '-> 'b) -> 'b
          val iter2 :
            t ->
            t ->
            f:([ `Both of outer * outer | `Left of outer | `Right of outer ] ->
               unit) ->
            unit
          val filter : t -> f:(outer -> bool) -> t
          val partition_tf : t -> f:(outer -> bool) -> t * t
          val elements : t -> outer list
          val min_elt : t -> outer option
          val min_elt_exn : t -> outer
          val max_elt : t -> outer option
          val max_elt_exn : t -> outer
          val choose : t -> outer option
          val choose_exn : t -> outer
          val split : t -> outer -> t * bool * t
          val group_by : t -> equiv:(outer -> outer -> bool) -> t list
          val find_exn : t -> f:(outer -> bool) -> outer
          val find_index : t -> int -> outer option
          val remove_index : t -> int -> t
          val to_tree : t -> Tree.t
          val empty : t
          val singleton : outer -> t
          val union_list : t list -> t
          val of_list : outer list -> t
          val of_array : outer array -> t
          val of_sorted_array : outer array -> t Or_error.t
          val of_sorted_array_unchecked : outer array -> t
          val stable_dedup_list : outer list -> outer list
          val map : ('a, 'b) Set.t -> f:('-> outer) -> t
          val filter_map : ('a, 'b) Set.t -> f:('-> outer 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
          val bin_size_t : t Bin_prot.Size.sizer
          val bin_write_t : t Bin_prot.Map_to_safe.writer
          val bin_write_t_ : t Bin_prot.Unsafe_write_c.writer
          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_writer_t : t Bin_prot.Type_class.writer
          val bin_reader_t : t Bin_prot.Type_class.reader
          val bin_t : t Bin_prot.Type_class.t
        end
      val validate_positive : outer Validate.check
      val validate_non_negative : outer Validate.check
      val validate_negative : outer Validate.check
      val validate_non_positive : outer Validate.check
      val is_positive : outer -> bool
      val is_non_negative : outer -> bool
      val is_negative : outer -> bool
      val is_non_positive : outer -> bool
      val ( >=. ) : outer -> outer -> bool
      val ( <=. ) : outer -> outer -> bool
      val ( =. ) : outer -> outer -> bool
      val ( >. ) : outer -> outer -> bool
      val ( <. ) : outer -> outer -> bool
      val ( <>. ) : outer -> outer -> bool
      val robustly_compare : outer -> outer -> int
      val validate_ordinary : outer Validate.check
      val nan : outer
      val infinity : outer
      val neg_infinity : outer
      val max_value : outer
      val min_value : outer
      val zero : outer
      val epsilon : outer
      val epsilon_float : outer
      val max_finite_value : outer
      val min_positive_value : outer
      val of_int : int -> outer
      val to_int : outer -> int
      val of_int64 : int64 -> outer
      val to_int64 : outer -> int64
      val round : ?dir:[ `Down | `Nearest | `Up | `Zero ] -> outer -> outer
      val iround :
        ?dir:[ `Down | `Nearest | `Up | `Zero ] -> outer -> int option
      val iround_exn :
        ?dir:[ `Down | `Nearest | `Up | `Zero ] -> outer -> int
      val round_towards_zero : outer -> outer
      val round_down : outer -> outer
      val round_up : outer -> outer
      val round_nearest : outer -> outer
      val iround_towards_zero : outer -> int option
      val iround_down : outer -> int option
      val iround_up : outer -> int option
      val iround_nearest : outer -> int option
      val iround_towards_zero_exn : outer -> int
      val iround_down_exn : outer -> int
      val iround_up_exn : outer -> int
      val iround_nearest_exn : outer -> int
      val is_nan : outer -> bool
      val is_inf : outer -> bool
      val min_inan : outer -> outer -> outer
      val max_inan : outer -> outer -> outer
      val ( + ) : outer -> outer -> outer
      val ( - ) : outer -> outer -> outer
      val ( * ) : outer -> outer -> outer
      val ( / ) : outer -> outer -> outer
      module Parts :
        sig type t val fractional : t -> outer val integral : t -> outer end
      val modf : outer -> Parts.t
      val mod_float : outer -> outer -> outer
      val add : outer -> outer -> outer
      val sub : outer -> outer -> outer
      val neg : outer -> outer
      val scale : outer -> outer -> outer
      val abs : outer -> outer
      val to_string_hum :
        ?delimiter:char ->
        ?decimals:int -> ?strip_zero:bool -> float -> string
      val ldexp : outer -> int -> outer
      val frexp : outer -> outer * int
      module Class :
        sig
          type t = Infinite | Nan | Normal | Subnormal | Zero
          val of_string : string -> t
          val to_string : t -> string
          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 classify : outer -> Class.t
      val is_finite : outer -> bool
      module Sign :
        sig
          type t = Neg | Zero | Pos
          val t_of_sexp : Sexplib.Sexp.t -> t
          val sexp_of_t : t -> Sexplib.Sexp.t
        end
      val sign : outer -> Sign.t
      module Terse :
        sig
          type t = outer
          val of_string : string -> t
          val to_string : t -> string
          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 outer_of_sexp : Sexplib.Sexp.t -> outer
      val sexp_of_outer : outer -> Sexplib.Sexp.t
      val bin_outer : outer Bin_prot.Type_class.t
      val bin_read_outer : outer Bin_prot.Read_ml.reader
      val bin_read_outer_ : outer Bin_prot.Unsafe_read_c.reader
      val bin_read_outer__ : (int -> outer) Bin_prot.Unsafe_read_c.reader
      val bin_reader_outer : outer Bin_prot.Type_class.reader
      val bin_size_outer : outer Bin_prot.Size.sizer
      val bin_write_outer : outer Bin_prot.Write_ml.writer
      val bin_write_outer_ : outer Bin_prot.Unsafe_write_c.writer
      val bin_writer_outer : outer Bin_prot.Type_class.writer
    end
end