A polymorphic hashtbl that uses Pool to avoid allocation.
This uses the standard linked-chain hashtable algorithm, albeit with links performed
through a pool and hence avoiding caml_modify (for table manipulation), even when
hashing object keys/values.
This implementation is worth exploring for your application if profiling demonstrates
that garbage collection and the caml_modify write barrier are a significant part of
your execution time.
We use [@@deriving sexp_of] 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 sexp], to use
polymorphic comparison and hashing.
create_mapped get_key get_data [x1,...,xn]
= of_alist [get_key x1, get_data x1; ...; get_key xn, get_data xn]
create_with_key ~get_key [x1,...,xn]
= of_alist [get_key x1, x1; ...; get_key xn, xn]
like filter_map, but function takes both key and data as arguments
returns new maps with bound values partitioned by f applied to the bound values
like partition_map, but function takes both key and data as arguments
Merge 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.
Returns the list of all data for given hashtable.
filter_inplace t ~f removes all the elements from t that don't satisfy f.
replace_all t ~f applies f to all elements in t, transforming them in place
filter_replace_all combines the effects of replace_all and filter_inplace
resize t size ensures that t can hold at least size entries without resizing
(again), provided that t has growth enabled. This is useful for sizing global
tables during application initialization, to avoid subsequent, expensive growth
online. See Zero.Immediate.String.resize, for example.
on_grow ~before ~after allows you to connect higher level loggers to the point where
these hashtbls grow. before is called before the table grows, and after after it.
This permits you to e.g. measure the time elapsed between the two.
This is only meant for debugging and profiling, e.g. note that once a callback is installed, there is no way to remove it.