Hash tables, mutable lookup-tables supporting constant-time lookup and in-place modification.
type ('a, 'b) tWe use [@@deriving_inline sexp_of][@@@end] but not [@@deriving sexp] because we want people to
be explicit about the hash and comparison functions used when creating hashtables.
One can use Hashtbl.Poly.t, which does have [@@deriving_inline sexp][@@@end], to use
polymorphic comparison and hashing.
include Invariant.S2 with type (a, b) t := (a, b) tval invariant : 'a Base__.Invariant_intf.inv ‑> 'b Base__.Invariant_intf.inv ‑> ('a, 'b) t Base__.Invariant_intf.invinclude Base__.Hashtbl_intf.Creators with type (a, b) t := (a, b) tval create : ?growth_allowed:bool ‑> ?size:int ‑> (module Base__.Hashtbl_intf.Key with type t = 'a) ‑> ('a, 'b) tval of_alist : ?growth_allowed:bool ‑> ?size:int ‑> (module Base__.Hashtbl_intf.Key with type t = 'a) ‑> ('a * 'b) list ‑> [ `Ok of ('a, 'b) t | `Duplicate_key of 'a ]val of_alist_report_all_dups : ?growth_allowed:bool ‑> ?size:int ‑> (module Base__.Hashtbl_intf.Key with type t = 'a) ‑> ('a * 'b) list ‑> [ `Ok of ('a, 'b) t | `Duplicate_keys of 'a list ]val of_alist_or_error : ?growth_allowed:bool ‑> ?size:int ‑> (module Base__.Hashtbl_intf.Key with type t = 'a) ‑> ('a * 'b) list ‑> ('a, 'b) t Or_error.tval of_alist_exn : ?growth_allowed:bool ‑> ?size:int ‑> (module Base__.Hashtbl_intf.Key with type t = 'a) ‑> ('a * 'b) list ‑> ('a, 'b) tval of_alist_multi : ?growth_allowed:bool ‑> ?size:int ‑> (module Base__.Hashtbl_intf.Key with type t = 'a) ‑> ('a * 'b) list ‑> ('a, 'b list) tval create_mapped : ?growth_allowed:bool ‑> ?size:int ‑> (module Base__.Hashtbl_intf.Key with type t = 'a) ‑> get_key:('r ‑> 'a) ‑> get_data:('r ‑> 'b) ‑> 'r list ‑> [ `Ok of ('a, 'b) t | `Duplicate_keys of 'a list ]create_mapped get_key get_data [x1,...,xn]
= of_alist [get_key x1, get_data x1; ...; get_key xn, get_data xn]val create_with_key : ?growth_allowed:bool ‑> ?size:int ‑> (module Base__.Hashtbl_intf.Key with type t = 'a) ‑> get_key:('r ‑> 'a) ‑> 'r list ‑> [ `Ok of ('a, 'r) t | `Duplicate_keys of 'a list ]create_with_key ~get_key [x1,...,xn]
= of_alist [get_key x1, x1; ...; get_key xn, xn]val create_with_key_or_error : ?growth_allowed:bool ‑> ?size:int ‑> (module Base__.Hashtbl_intf.Key with type t = 'a) ‑> get_key:('r ‑> 'a) ‑> 'r list ‑> ('a, 'r) t Or_error.tval create_with_key_exn : ?growth_allowed:bool ‑> ?size:int ‑> (module Base__.Hashtbl_intf.Key with type t = 'a) ‑> get_key:('r ‑> 'a) ‑> 'r list ‑> ('a, 'r) tval group : ?growth_allowed:bool ‑> ?size:int ‑> (module Base__.Hashtbl_intf.Key with type t = 'a) ‑> get_key:('r ‑> 'a) ‑> get_data:('r ‑> 'b) ‑> combine:('b ‑> 'b ‑> 'b) ‑> 'r list ‑> ('a, 'b) tinclude Base__.Hashtbl_intf.Accessors with type (a, b) t := (a, b) t with type 'a key = 'aval clear : (_, _) t ‑> unitAttempting to modify (set, remove, etc.) the hashtable during iteration (fold,
iter, iter_keys, iteri) will raise an exception.
val iter : (_, 'b) t ‑> f:('b ‑> unit) ‑> unitval exists : (_, 'b) t ‑> f:('b ‑> bool) ‑> boolval for_all : (_, 'b) t ‑> f:('b ‑> bool) ‑> boolval count : (_, 'b) t ‑> f:('b ‑> bool) ‑> intval length : (_, _) t ‑> intval is_empty : (_, _) t ‑> boolval partition_mapi : ('a, 'b) t ‑> f:(key:'a key ‑> data:'b ‑> [ `Fst of 'c | `Snd of 'd ]) ‑> ('a, 'c) t * ('a, 'd) tlike partition_map, but function takes both key and data as arguments
returns a pair of tables (t1, t2), where t1 contains all the elements of the
initial table which satisfy the predicate f, and t2 contains all the elements
which do not satisfy f.
find_or_add t k ~default returns the data associated with key k if it
is in the table t, otherwise it lets d = default() and adds it to the
table.
find_exn t k returns the current binding of k in t, or raises Caml.Not_found or
Not_found_s if no such binding exists.
val find_and_call : ('a, 'b) t ‑> 'a key ‑> if_found:('b ‑> 'c) ‑> if_not_found:('a key ‑> 'c) ‑> 'cfind_and_call t k ~if_found ~if_not_found
is equivalent to:
match find t k with Some v -> if_found v | None -> if_not_found k
except that it doesn't allocate the option.
find_and_remove t k returns Some (the current binding) of k in t and removes
it, or None is no such binding exists
val merge : ('k, 'a) t ‑> ('k, 'b) t ‑> f:(key:'k key ‑> [ `Left of 'a | `Right of 'b | `Both of 'a * 'b ] ‑> 'c option) ‑> ('k, 'c) tMerge two hashtables.
The result of merge f h1 h2 has as keys the set of all k in the
union of the sets of keys of h1 and h2 for which d(k) is not
None, where:
d(k) =
k in h1 is to d1, and h2 does not map k;k in h2 is to d2, and h1 does not map k;k in h1 is to d1 and k in h2 is to d2.Each key k is mapped to a single piece of data x, where d(k) = Some x.
val merge_into : src:('k, 'a) t ‑> dst:('k, 'b) t ‑> f:(key:'k key ‑> 'a ‑> 'b option ‑> 'b merge_into_action) ‑> unitval filter_inplace : (_, 'b) t ‑> f:('b ‑> bool) ‑> unitval map_inplace : (_, 'b) t ‑> f:('b ‑> 'b) ‑> unitmap_inplace t ~f applies f to all elements in t, transforming them in place
val filter_map_inplace : (_, 'b) t ‑> f:('b ‑> 'b option) ‑> unitfilter_map_inplace combines the effects of map_inplace and filter_inplace
equal t1 t2 f and similar t1 t2 f both return true iff t1 and t2 have the
same keys and for all keys k, f (find_exn t1 k) (find_exn t2 k). equal and
similar only differ in their types.
val validate : name:('a key ‑> string) ‑> 'b Validate.check ‑> ('a, 'b) t Validate.checkinclude Base__.Hashtbl_intf.Multi with type (a, b) t := (a, b) t with type a key := a keyadd_multi t ~key ~data if key is present in the table then cons
data on the list, otherwise add key with a single element list.
val hashable_s : ('key, _) t ‑> (module Base__.Hashtbl_intf.Key with type t = 'key)module type Accessors = Base__.Hashtbl_intf.Accessorsmodule type Creators = Base__.Hashtbl_intf.Creatorsmodule type Key = Base__.Hashtbl_intf.Keymodule type Multi = Base__.Hashtbl_intf.Multimodule type S_poly = Base__.Hashtbl_intf.S_polymodule type S_without_submodules = Base__.Hashtbl_intf.S_without_submodulesmodule type Sexp_of_m : sig ... endmodule type M_of_sexp : sig ... end