-module(utMapsFold).
|
|
|
|
-export([fold/1, diff/2, diffKeys/2]).
|
|
|
|
fold(Map) ->
|
|
fold(maps:iterator(Map), []).
|
|
|
|
fold(Iterator, AccList) ->
|
|
case maps:next(Iterator) of
|
|
{Key, Value, NextIter} ->
|
|
fold(NextIter, [{Key, Value} | AccList]);
|
|
none ->
|
|
AccList
|
|
end.
|
|
|
|
|
|
diff(Map1, Map2) ->
|
|
case map_size(Map1) =< map_size(Map2) of
|
|
true ->
|
|
diff_1(maps:next(maps:iterator(Map1)), Map1, Map2);
|
|
_ ->
|
|
diff_2(maps:next(maps:iterator(Map2)), Map1)
|
|
end.
|
|
|
|
diff_1(none, Map1, _Map2) ->
|
|
Map1;
|
|
diff_1({Key, _Value, NextIter}, Map1, Map2) ->
|
|
case maps:is_key(Key, Map2) of
|
|
true ->
|
|
diff_1(maps:next(NextIter), maps:remove(Key, Map1), Map2);
|
|
_ ->
|
|
diff_1(maps:next(NextIter), Map1, Map2)
|
|
end.
|
|
|
|
diff_2(none, Map1) ->
|
|
Map1;
|
|
diff_2({Key, _Value, NextIter}, Map1) ->
|
|
diff_2(maps:next(NextIter), maps:remove(Key, Map1)).
|
|
|
|
diffKeys(Map1, Map2) ->
|
|
case map_size(Map1) =< map_size(Map2) of
|
|
true ->
|
|
diffKeys_1(maps:next(maps:iterator(Map1)), Map2, []);
|
|
_ ->
|
|
diffKeys_2(maps:next(maps:iterator(Map2)), Map1)
|
|
end.
|
|
|
|
diffKeys_1(none, _Map2, Acc) ->
|
|
Acc;
|
|
diffKeys_1({Key, _Value, NextIter}, Map2, Acc) ->
|
|
case maps:is_key(Key, Map2) of
|
|
true ->
|
|
diffKeys_1(maps:next(NextIter), Map2, Acc);
|
|
_ ->
|
|
diffKeys_1(maps:next(NextIter), Map2, [Key | Acc])
|
|
end.
|
|
|
|
diffKeys_2(none, Map1) ->
|
|
maps:to_list(Map1);
|
|
diffKeys_2({Key, _Value, NextIter}, Map1) ->
|
|
diffKeys_2(maps:next(NextIter), maps:remove(Key, Map1)).
|