feat(map_lib): support emqx_map_lib:deep_merge/2
This commit is contained in:
parent
807bbb391c
commit
6d92d87ae7
|
@ -19,6 +19,7 @@
|
||||||
, deep_get/3
|
, deep_get/3
|
||||||
, deep_find/2
|
, deep_find/2
|
||||||
, deep_put/3
|
, deep_put/3
|
||||||
|
, deep_merge/2
|
||||||
, safe_atom_key_map/1
|
, safe_atom_key_map/1
|
||||||
, unsafe_atom_key_map/1
|
, unsafe_atom_key_map/1
|
||||||
]).
|
]).
|
||||||
|
@ -60,6 +61,23 @@ deep_put([Key | KeyPath], Map, Config) ->
|
||||||
SubMap = deep_put(KeyPath, maps:get(Key, Map, #{}), Config),
|
SubMap = deep_put(KeyPath, maps:get(Key, Map, #{}), Config),
|
||||||
Map#{Key => SubMap}.
|
Map#{Key => SubMap}.
|
||||||
|
|
||||||
|
%% #{a => #{b => 3, c => 2}, d => 4}
|
||||||
|
%% = deep_merge(#{a => #{b => 1, c => 2}, d => 4}, #{a => #{b => 3}}).
|
||||||
|
-spec deep_merge(map(), map()) -> map().
|
||||||
|
deep_merge(BaseMap, NewMap) ->
|
||||||
|
NewKeys = maps:keys(NewMap) -- maps:keys(BaseMap),
|
||||||
|
MergedBase = maps:fold(fun(K, V, Acc) ->
|
||||||
|
case maps:find(K, NewMap) of
|
||||||
|
error ->
|
||||||
|
Acc#{K => V};
|
||||||
|
{ok, NewV} when is_map(V), is_map(NewV) ->
|
||||||
|
Acc#{K => deep_merge(V, NewV)};
|
||||||
|
{ok, NewV} ->
|
||||||
|
Acc#{K => NewV}
|
||||||
|
end
|
||||||
|
end, #{}, BaseMap),
|
||||||
|
maps:merge(MergedBase, maps:with(NewKeys, NewMap)).
|
||||||
|
|
||||||
unsafe_atom_key_map(Map) ->
|
unsafe_atom_key_map(Map) ->
|
||||||
covert_keys_to_atom(Map, fun(K) -> binary_to_atom(K, utf8) end).
|
covert_keys_to_atom(Map, fun(K) -> binary_to_atom(K, utf8) end).
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue