diff options
author | Brett Snyder <bsnyder@digitalocean.com> | 2019-05-15 07:22:03 -0500 |
---|---|---|
committer | Louis Pilfold <louis@lpil.uk> | 2019-05-15 17:32:50 +0100 |
commit | ee03f5a0465e176e220060164a5ffc408f73ed0d (patch) | |
tree | 1963a55b088684d78a5c575193edcc46f4e7738e | |
parent | af07c099e69e296aaeabeebcb3e0a304bcb24d1d (diff) | |
download | gleam_stdlib-ee03f5a0465e176e220060164a5ffc408f73ed0d.tar.gz gleam_stdlib-ee03f5a0465e176e220060164a5ffc408f73ed0d.zip |
optimize map:fold recursion
-rw-r--r-- | gen/src/map_dict.erl | 13 | ||||
-rw-r--r-- | src/map_dict.gleam | 12 |
2 files changed, 16 insertions, 9 deletions
diff --git a/gen/src/map_dict.erl b/gen/src/map_dict.erl index e72b92d..5155ec7 100644 --- a/gen/src/map_dict.erl +++ b/gen/src/map_dict.erl @@ -75,12 +75,15 @@ update(Dict, Key, F) -> put(Dict, Key, F({error, not_found})) end. -fold(Dict, Acc, F) -> - Kvs = to_list(Dict), - case Kvs of +do_fold(List, Acc, F) -> + case List of [] -> Acc; - [{K, V} | _] -> - fold(delete(Dict, K), F(K, V, Acc), F) + [{K, V} | Tail] -> + do_fold(Tail, F(K, V, Acc), F) end. + +fold(Dict, Acc, F) -> + Kvs = to_list(Dict), + do_fold(Kvs, Acc, F). diff --git a/src/map_dict.gleam b/src/map_dict.gleam index c25378f..2ec141a 100644 --- a/src/map_dict.gleam +++ b/src/map_dict.gleam @@ -87,10 +87,14 @@ pub fn update(dict, key, f) { } } -pub fn fold(dict, acc, f) { - let kvs = to_list(dict) - case kvs { +fn do_fold(list, acc, f) { + case list { | [] -> acc - | [{k, v} | _] -> fold(delete(dict, k), f(k, v, acc), f) + | [{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) +} |