HashMap
The top level provides generic mutable hash map operations.
t
REStype t<'key, 'value, 'id>
The type of hash tables from type 'key
to type 'value
.
id
REStype id<'a, 'id> = Belt.Id.hashable<'a, 'id>
The identity needed for making an empty hash map.
make
let make: (~hintSize: int, ~id: id<'key, 'id>) => t<'key, 'value, 'id>
make(~hintSize=10, ~id)
creates a new map by taking in the comparator and hintSize
.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let hMap = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.set(hMap, 0, "a")
clear
let clear: t<'key, 'value, 'id> => unit
Clears a hash table.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let hMap = Belt.HashMap.fromArray([(1, "1")], ~id=module(IntHash))
Belt.HashMap.clear(hMap)
Belt.HashMap.isEmpty(hMap) == true
isEmpty
let isEmpty: t<'a, 'b, 'c> => bool
isEmpty(m)
checks whether a hash map is empty.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
Belt.HashMap.isEmpty(Belt.HashMap.fromArray([(1, "1")], ~id=module(IntHash))) == false
set
let set: (t<'key, 'value, 'id>, 'key, 'value) => unit
set(hMap, k, v)
if k
does not exist, add the binding k,v
, otherwise, update the old value with the new v
.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let s0 = Belt.HashMap.fromArray([(2, "2"), (1, "1"), (3, "3")], ~id=module(IntHash))
Belt.HashMap.set(s0, 2, "3")
Belt.HashMap.valuesToArray(s0) == ["1", "3", "3"]
copy
let copy: t<'key, 'value, 'id> => t<'key, 'value, 'id>
Creates copy of a hash map.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let s0 = Belt.HashMap.fromArray([(2, "2"), (1, "1"), (3, "3")], ~id=module(IntHash))
let s1 = Belt.HashMap.copy(s0)
Belt.HashMap.set(s0, 2, "3")
Belt.HashMap.get(s0, 2) != Belt.HashMap.get(s1, 2)
get
let get: (t<'key, 'value, 'id>, 'key) => option<'value>
Returns value bound under specific key. If values not exist returns None
.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let s0 = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.set(s0, 1, "value1")
Belt.HashMap.get(s0, 1) == Some("value1")
Belt.HashMap.get(s0, 2) == None
has
let has: (t<'key, 'value, 'id>, 'key) => bool
Checks if x
is bound in tbl
.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let s0 = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.set(s0, 1, "value1")
Belt.HashMap.has(s0, 1) == true
Belt.HashMap.has(s0, 2) == false
remove
let remove: (t<'key, 'value, 'id>, 'key) => unit
If bound exists, removes it from the hash map.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let s0 = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.set(s0, 1, "value1")
Belt.HashMap.remove(s0, 1)
Belt.HashMap.has(s0, 1) == false
forEachU
let forEachU: (t<'key, 'value, 'id>, (. 'key, 'value) => unit) => unit
Same as forEach but takes uncurried functon.
forEach
let forEach: (t<'key, 'value, 'id>, ('key, 'value) => unit) => unit
forEach(tbl, f)
applies f
to all bindings in table tbl
. f
receives the key as first argument, and the associated value as second argument. Each binding is presented exactly once to f
.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let s0 = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.set(s0, 1, "value1")
Belt.HashMap.forEach(s0, (key, value) => Js.log2(key, value))
// prints (1, "value1")
reduceU
let reduceU: (t<'key, 'value, 'id>, 'c, (. 'c, 'key, 'value) => 'c) => 'c
Same as reduce but takes uncurried functon.
reduce
let reduce: (t<'key, 'value, 'id>, 'c, ('c, 'key, 'value) => 'c) => 'c
reduce(tbl, init, f)
computes (f(kN, dN) ... (f(k1, d1, init))...)
, where k1 ... kN
are the keys of all bindings in tbl
, and d1 ... dN
are the associated values. Each binding is presented exactly once to f
.
The order in which the bindings are passed to f
is unspecified. However, if the table contains several bindings for the same key, they are passed to f
in reverse order of introduction, that is, the most recent binding is passed first.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let s0 = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.set(s0, 1, "value1")
Belt.HashMap.set(s0, 2, "value2")
Belt.HashMap.reduce(s0, "", (acc, key, value) => acc ++ (", " ++ value)) == "value1, value2"
keepMapInPlaceU
let keepMapInPlaceU: (t<'key, 'value, 'id>, (. 'key, 'value) => option<'value>) => unit
Same as keepMapInPlace but takes uncurried functon.
keepMapInPlace
let keepMapInPlace: (t<'key, 'value, 'id>, ('key, 'value) => option<'value>) => unit
Filters out values for which function f
returned None
.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let s0 = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.set(s0, 1, "value1")
Belt.HashMap.set(s0, 2, "value2")
Belt.HashMap.keepMapInPlace(s0, (key, value) => key == 1 ? None : Some(value))
size
let size: t<'a, 'b, 'c> => int
size(tbl)
returns the number of bindings in tbl
. It takes constant time.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let s0 = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.set(s0, 1, "value1")
Belt.HashMap.set(s0, 2, "value2")
Belt.HashMap.size(s0) == 2
toArray
let toArray: t<'key, 'value, 'id> => array<('key, 'value)>
Returns array of key value pairs.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let s0 = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.set(s0, 1, "value1")
Belt.HashMap.set(s0, 2, "value2")
Belt.HashMap.toArray(s0) == [(1, "value1"), (2, "value2")]
keysToArray
let keysToArray: t<'key, 'a, 'b> => array<'key>
Returns array of keys.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let s0 = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.set(s0, 1, "value1")
Belt.HashMap.set(s0, 2, "value2")
Belt.HashMap.keysToArray(s0) == [1, 2]
valuesToArray
let valuesToArray: t<'a, 'value, 'b> => array<'value>
Returns array of values.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let s0 = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.set(s0, 1, "value1")
Belt.HashMap.set(s0, 2, "value2")
Belt.HashMap.valuesToArray(s0) == ["value1", "value2"]
fromArray
let fromArray: (array<('key, 'value)>, ~id: id<'key, 'id>) => t<'key, 'value, 'id>
Creates new hash map from array of pairs.
Returns array of values.
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let s0 = Belt.HashMap.fromArray([(1, "value1"), (2, "value2")], ~id=module(IntHash))
Belt.HashMap.toArray(s0) == [(1, "value1"), (2, "value2")]
mergeMany
let mergeMany: (t<'key, 'value, 'id>, array<('key, 'value)>) => unit
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let hMap = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.mergeMany(hMap, [(1, "1"), (2, "2")])
getBucketHistogram
let getBucketHistogram: t<'a, 'b, 'c> => array<int>
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let hMap = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.set(hMap, 1, "1")
Belt.HashMap.getBucketHistogram(hMap)
logStats
let logStats: t<'a, 'b, 'c> => unit
RESmodule IntHash = Belt.Id.MakeHashable({
type t = int
let hash = a => a
let eq = (a, b) => a == b
})
let hMap = Belt.HashMap.make(~hintSize=10, ~id=module(IntHash))
Belt.HashMap.set(hMap, 1, "1")
Belt.HashMap.logStats(hMap)