sig
  type 'a equal = '-> '-> bool
  type 'a ord = '-> '-> int
  type 'a hash = '-> int
  type 'a sequence = ('-> unit) -> unit
  type ('a, +'b) t = private {
    is_empty : unit -> bool;
    size : unit -> int;
    get_exn : '-> 'b;
    iter : ('-> '-> unit) -> unit;
    fold : 'c. ('-> '-> '-> 'c) -> '-> 'c;
    choose : unit -> ('a * 'b) option;
  }
  type ('a, 'b) map = ('a, 'b) OLinq_map.t
  val get : ('a, 'b) OLinq_map.t -> '-> 'b option
  val get_exn : ('a, 'b) OLinq_map.t -> '-> 'b
  val mem : ('a, 'b) OLinq_map.t -> '-> bool
  val size : ('a, 'b) OLinq_map.t -> int
  val to_seq : ('a, 'b) OLinq_map.t -> ('a * 'b) OLinq_map.sequence
  val to_seq_multimap :
    ('a, 'b list) OLinq_map.t -> ('a * 'b) OLinq_map.sequence
  val to_list : ('a, 'b) OLinq_map.t -> ('a * 'b) list
  val to_rev_list : ('a, 'b) OLinq_map.t -> ('a * 'b) list
  val fold :
    ('acc -> '-> '-> 'acc) -> 'acc -> ('a, 'b) OLinq_map.t -> 'acc
  val fold_multimap :
    ('acc -> '-> '-> 'acc) -> 'acc -> ('a, 'b list) OLinq_map.t -> 'acc
  val get_seq : '-> ('a, 'b) OLinq_map.t -> 'OLinq_map.sequence
  val iter : ('a, 'b) OLinq_map.t -> ('-> '-> unit) -> unit
  val choose : ('a, 'b) OLinq_map.t -> ('a * 'b) option
  module Build :
    sig
      type ('a, 'b) t
      val get : ('a, 'b) OLinq_map.Build.t -> ('a, 'b) OLinq_map.map
      val add : ('a, 'b) OLinq_map.Build.t -> '-> '-> unit
      val add_multimap : ('a, 'b list) OLinq_map.Build.t -> '-> '-> unit
      val add_count : ('a, int) OLinq_map.Build.t -> '-> unit
      val update :
        ('a, 'b) OLinq_map.Build.t -> '-> f:('-> 'b) -> or_:'-> unit
      val of_hash :
        ?eq:('-> '-> bool) ->
        ?hash:('-> int) -> ?size:int -> unit -> ('a, 'b) OLinq_map.Build.t
      val of_cmp :
        ?cmp:('-> '-> int) -> unit -> ('a, 'b) OLinq_map.Build.t
      type 'a src =
          Cmp of 'OLinq_map.ord
        | Hash of 'OLinq_map.equal * 'OLinq_map.hash * int
        | Default
      val of_src : 'OLinq_map.Build.src -> ('a, 'b) OLinq_map.Build.t
      val src_of_args :
        ?cmp:'OLinq_map.ord ->
        ?eq:'OLinq_map.equal ->
        ?hash:'OLinq_map.hash -> unit -> 'OLinq_map.Build.src
      val make :
        ?cmp:'OLinq_map.ord ->
        ?eq:'OLinq_map.equal ->
        ?hash:'OLinq_map.hash -> unit -> ('a, 'b) OLinq_map.Build.t
    end
  val of_seq :
    ?src:'OLinq_map.Build.src ->
    ('a * 'b) OLinq_map.sequence -> ('a, 'b list) OLinq_map.t
  val of_list :
    ?src:'OLinq_map.Build.src ->
    ('a * 'b) list -> ('a, 'b list) OLinq_map.t
  val count_seq :
    ?src:'OLinq_map.Build.src ->
    'OLinq_map.sequence -> ('a, int) OLinq_map.t
  val map : ('-> 'c) -> ('a, 'b) OLinq_map.t -> ('a, 'c) OLinq_map.t
  val reverse :
    ?src:'OLinq_map.Build.src ->
    ('a, 'b) OLinq_map.t -> ('b, 'a list) OLinq_map.t
  val reverse_multimap :
    ?src:'OLinq_map.Build.src ->
    ('a, 'b list) OLinq_map.t -> ('b, 'a list) OLinq_map.t
  val flatten :
    ('a, 'OLinq_map.sequence) OLinq_map.t -> ('a * 'b) OLinq_map.sequence
  val flatten_l : ('a, 'b list) OLinq_map.t -> ('a * 'b) OLinq_map.sequence
end