File 2193-stdlib-Add-maps-update_with-3-4.patch of Package erlang

From 8d5bc31684f8b6969b5bfde70e25b153d4018f61 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bj=C3=B6rn-Egil=20Dahlberg?= <egil@erlang.org>
Date: Wed, 13 Apr 2016 19:06:05 +0200
Subject: [PATCH 4/6] stdlib: Add maps:update_with/3,4

Maps equivalent to dict:update/3,4
---
 lib/stdlib/src/maps.erl | 42 +++++++++++++++++++++++++++++++++++++-----
 1 file changed, 37 insertions(+), 5 deletions(-)

diff --git a/lib/stdlib/src/maps.erl b/lib/stdlib/src/maps.erl
index a8c2740..ba9ad4f 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(),
-- 
2.1.4

openSUSE Build Service is sponsored by