-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)).