From 6d92d87ae78ea0f4f23626b1a6b52406ca447da8 Mon Sep 17 00:00:00 2001 From: Shawn <506895667@qq.com> Date: Mon, 5 Jul 2021 19:11:05 +0800 Subject: [PATCH] feat(map_lib): support emqx_map_lib:deep_merge/2 --- apps/emqx/src/emqx_map_lib.erl | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/apps/emqx/src/emqx_map_lib.erl b/apps/emqx/src/emqx_map_lib.erl index 8b3108a53..477891c51 100644 --- a/apps/emqx/src/emqx_map_lib.erl +++ b/apps/emqx/src/emqx_map_lib.erl @@ -19,6 +19,7 @@ , deep_get/3 , deep_find/2 , deep_put/3 + , deep_merge/2 , safe_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), 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) -> covert_keys_to_atom(Map, fun(K) -> binary_to_atom(K, utf8) end).