diff options
author | Björn-Egil Dahlberg <[email protected]> | 2016-04-13 19:06:05 +0200 |
---|---|---|
committer | Björn-Egil Dahlberg <[email protected]> | 2016-04-27 15:26:54 +0200 |
commit | 8d5bc31684f8b6969b5bfde70e25b153d4018f61 (patch) | |
tree | 89e0c0987af5ba4e616fe958f3183165492dea83 /lib/stdlib/src | |
parent | 4c8d8550c4bb2e031440f9a0fdbe0e022247e695 (diff) | |
download | otp-8d5bc31684f8b6969b5bfde70e25b153d4018f61.tar.gz otp-8d5bc31684f8b6969b5bfde70e25b153d4018f61.tar.bz2 otp-8d5bc31684f8b6969b5bfde70e25b153d4018f61.zip |
stdlib: Add maps:update_with/3,4
Maps equivalent to dict:update/3,4
Diffstat (limited to 'lib/stdlib/src')
-rw-r--r-- | lib/stdlib/src/maps.erl | 42 |
1 files changed, 37 insertions, 5 deletions
diff --git a/lib/stdlib/src/maps.erl b/lib/stdlib/src/maps.erl index a8c2740617..ba9ad4f549 100644 --- a/lib/stdlib/src/maps.erl +++ b/lib/stdlib/src/maps.erl @@ -20,12 +20,12 @@ -module(maps). --export([get/3,filter/2,fold/3, map/2, - size/1, +-export([get/3, filter/2,fold/3, + map/2, size/1, + update_with/3, update_with/4, without/2, with/2]). - -%%% BIFs +%% BIFs -export([get/2, find/2, from_list/1, is_key/2, keys/1, merge/2, new/0, put/3, remove/2, take/2, @@ -134,8 +134,40 @@ update(_,_,_) -> erlang:nif_error(undef). values(_) -> erlang:nif_error(undef). +%% End of BIFs + +-spec update_with(Key,Fun,Map1) -> Map2 when + Key :: term(), + Map1 :: map(), + Map2 :: map(), + Fun :: fun((Value1 :: term()) -> Value2 :: term()). + +update_with(Key,Fun,Map) when is_function(Fun,1), is_map(Map) -> + try maps:get(Key,Map) of + Val -> maps:update(Key,Fun(Val),Map) + catch + error:{badkey,_} -> + erlang:error({badkey,Key},[Key,Fun,Map]) + end; +update_with(Key,Fun,Map) -> + erlang:error(error_type(Map),[Key,Fun,Map]). + + +-spec update_with(Key,Fun,Init,Map1) -> Map2 when + Key :: term(), + Map1 :: Map1, + Map2 :: Map2, + Fun :: fun((Value1 :: term()) -> Value2 :: term()), + Init :: term(). + +update_with(Key,Fun,Init,Map) when is_function(Fun,1), is_map(Map) -> + case maps:find(Key,Map) of + {ok,Val} -> maps:update(Key,Fun(Val),Map); + error -> maps:put(Key,Init,Map) + end; +update_with(Key,Fun,Init,Map) -> + erlang:error(error_type(Map),[Key,Fun,Init,Map]). -%%% End of BIFs -spec get(Key, Map, Default) -> Value | Default when Key :: term(), |