Packages
gleam_stdlib
0.3.0
1.0.3
1.0.2
1.0.1
1.0.0
0.71.0
0.70.0
0.69.0
0.68.1
0.68.0
0.67.1
0.67.0
0.65.0
0.64.0
0.63.2
0.63.1
0.63.0
0.62.1
0.62.0
0.61.0
0.60.0
0.59.0
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.1
0.35.0
0.34.0
0.33.1
0.33.0
0.32.1
0.32.0
0.31.0
0.30.2
0.30.1
0.30.0
0.29.2
0.29.1
0.29.0
0.28.2
0.28.1
0.28.0
0.27.0
0.26.1
0.26.0
0.25.0
0.24.0
0.23.0
0.22.3
0.22.2
0.22.1
0.22.0
0.21.0
0.20.0
0.19.3
0.19.2
0.19.1
0.19.0
0.18.1
0.18.0
0.18.0-rc1
0.17.1
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.1
0.10.0
0.9.0
0.8.0
0.7.0
0.6.0
0.5.0
0.4.0
0.4.0-rc1
0.3.1
0.3.0
0.2.0
retired
A standard library for the Gleam programming language
Current section
Files
Jump to
Current section
Files
src/gleam/map_dict.gleam
import gleam/any
import gleam/result
import gleam/list
pub external type MapDict(key, value);
pub enum NotFound =
| NotFound
pub external fn size(MapDict(k, v)) -> Int
= "maps" "size"
pub external fn to_list(MapDict(key, value)) -> List({key, value})
= "maps" "to_list"
pub external fn from_list(List({key, value})) -> MapDict(key, value)
= "maps" "from_list"
external fn is_key(key, MapDict(key, v)) -> Bool
= "maps" "is_key"
pub fn has_key(map, key) {
is_key(key, map)
}
pub external fn new() -> MapDict(key, value)
= "maps" "new"
pub external fn fetch(MapDict(key, value), key) -> Result(value, NotFound)
= "gleam__stdlib" "map_fetch";
external fn erl_put(key, value, MapDict(key, value)) -> MapDict(key, value)
= "maps" "put";
pub fn put(map, key, value) {
erl_put(key, value, map)
}
external fn erl_map_values(fn(key, value) -> value, MapDict(key, value))
-> MapDict(key, value)
= "maps" "map";
pub fn map_values(map, fun) {
erl_map_values(fun, map)
}
pub external fn keys(MapDict(keys, v)) -> List(keys)
= "maps" "keys"
pub external fn values(MapDict(k, values)) -> List(values)
= "maps" "values"
external fn erl_filter(fn(key, value) -> Bool, MapDict(key, value))
-> MapDict(key, value)
= "maps" "filter";
pub fn filter(map, fun) {
erl_filter(fun, map)
}
external fn erl_take(List(k), MapDict(k, v)) -> MapDict(k, v) = "maps" "with"
pub fn take(map, keys) {
erl_take(keys, map)
}
pub external fn merge(MapDict(k, v), MapDict(k, v)) -> MapDict(k, v) = "maps" "merge"
external fn erl_delete(k, MapDict(k, v)) -> MapDict(k, v) = "maps" "remove"
pub fn delete(map, key) {
erl_delete(key, map)
}
pub fn drop(map, keys) {
list:fold(keys, map, fn(key, acc) {
delete(acc, key)
})
}
pub external type NotFound;
pub fn update(dict, key, f) {
case fetch(dict, key) {
| Ok(value) -> put(dict, key, f(Ok(value)))
| Error(_) -> put(dict, key, f(Error(NotFound)))
}
}
fn do_fold(list, acc, f) {
case list {
| [] -> acc
| [{k, v} | tail] -> do_fold(tail, f(k, v, acc), f)
}
}
pub fn fold(dict, acc, f) {
let kvs = to_list(dict)
do_fold(kvs, acc, f)
}