|
|
@ -1,6 +1,6 @@ |
|
|
|
-module(utMapsFold). |
|
|
|
|
|
|
|
-export([fold/1]). |
|
|
|
-export([fold/1, diff/2, diffKeys/2]). |
|
|
|
|
|
|
|
fold(Map) -> |
|
|
|
fold(maps:iterator(Map), []). |
|
|
@ -12,3 +12,50 @@ fold(Iterator, 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)). |