Current section
Files
Jump to
Current section
Files
src/agnostic/internals/mutable_map.gleam
/// A `MutableMap` functions like Gleam's `Dict` and exposes a subset of the same
/// api. As the name implies, there are some important things to know:
///
/// - On the JavaScript target, updates to the map are performed **in-place** and
/// will mutate the map directly.
///
/// - On the JavaScript target, keys in the map are compared by reference, not by
/// hash or value.
///
/// Gleam has neither mutable data structures nor reference equality, so it's
/// incredibly important to use this module with care. It is primarily intended
/// to be used durring diffing to avoid the expensive overhead of (re)constructing
/// event and keyed node lookups.
///
pub type MutableMap(key, value)
///
///
@external(erlang, "maps", "new")
@external(javascript, "./mutable_map.ffi.mjs", "empty")
pub fn new() -> MutableMap(key, value)
///
///
@external(javascript, "./mutable_map.ffi.mjs", "get")
pub fn unsafe_get(map: MutableMap(key, value), key: key) -> value {
do_get(key, map)
}
@external(erlang, "maps", "get")
fn do_get(key: key, map: MutableMap(key, value)) -> value
@external(javascript, "./mutable_map.ffi.mjs", "get_or_compute")
pub fn get_or_compute(
map: MutableMap(key, value),
key: key,
compute: fn() -> value,
) -> value {
case do_find(map, key) {
Ok(value) -> value
_ -> compute()
}
}
@external(erlang, "gleam@dict", "get")
fn do_find(map: MutableMap(key, value), key: key) -> Result(value, Nil)
///
///
@external(javascript, "./mutable_map.ffi.mjs", "has_key")
pub fn has_key(map: MutableMap(key, value), key: key) -> Bool {
do_has_key(key, map)
}
@external(erlang, "maps", "is_key")
fn do_has_key(key: key, dict: MutableMap(key, value)) -> Bool
///
///
@external(javascript, "./mutable_map.ffi.mjs", "insert")
pub fn insert(
map: MutableMap(key, value),
key: key,
value: value,
) -> MutableMap(key, value) {
do_put(key, value, map)
}
@external(erlang, "maps", "put")
fn do_put(
key: key,
value: value,
map: MutableMap(key, value),
) -> MutableMap(key, value)
///
///
@external(javascript, "./mutable_map.ffi.mjs", "remove")
pub fn delete(map: MutableMap(key, value), key: key) -> MutableMap(key, value) {
do_remove(key, map)
}
@external(erlang, "maps", "remove")
fn do_remove(key: key, map: MutableMap(key, value)) -> MutableMap(key, value)
///
///
@external(erlang, "maps", "size")
@external(javascript, "./mutable_map.ffi.mjs", "size")
pub fn size(map: MutableMap(key, value)) -> Int
///
///
pub fn is_empty(map: MutableMap(key, value)) -> Bool {
size(map) == 0
}