diff options
author | Louis Pilfold <louis@lpil.uk> | 2019-05-04 22:07:48 +0000 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2019-05-04 22:07:48 +0000 |
commit | 49df300ffe6f020a4df26dede27bef42d000c671 (patch) | |
tree | ae931ab693c58e3e174f06004514d1406a4119c8 /src | |
parent | 50021b4d4061f1fa1eac90986695531d8c4772e8 (diff) | |
download | gleam_stdlib-49df300ffe6f020a4df26dede27bef42d000c671.tar.gz gleam_stdlib-49df300ffe6f020a4df26dede27bef42d000c671.zip |
map_dict:update
Diffstat (limited to 'src')
-rw-r--r-- | src/map_dict.gleam | 25 |
1 files changed, 16 insertions, 9 deletions
diff --git a/src/map_dict.gleam b/src/map_dict.gleam index 3c49aa5..6033866 100644 --- a/src/map_dict.gleam +++ b/src/map_dict.gleam @@ -1,8 +1,6 @@ import any import result - -// TODO: update :: fn(MapDict(k, v), k, fn(Result(v, NotFound)) -> v) -> MapDict(k, v) -// TODO: delete :: fn(MapDict(k, v), k) -> MapDict(k, v) +import list pub external type MapDict(key, value); @@ -66,12 +64,6 @@ pub fn take(map, keys) { erl_take(keys, map) } -external fn erl_drop(List(k), MapDict(k, v)) -> MapDict(k, v) = "maps" "without" - -pub fn drop(map, keys) { - erl_drop(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" @@ -79,3 +71,18 @@ 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))) + } +} |