-module(maps_update_values).
-export([test/0]).
test() ->
V0 = id(1337),
M0 = #{ a => 1, val => V0},
V1 = get_val(M0),
M1 = M0#{ val := [V0,V1], "wazzup" => 42 },
[1337, {some_val, 1337}] = get_val(M1),
N = 110,
List = [{[I,1,2,3,I],{1,2,3,"wat",I}}|| I <- lists:seq(1,N)],
{_,_,#{val2 := {1,2,3,"wat",N}, val1 := [N,1,2,3,N]}} = lists:foldl(fun
({V2,V3},{Old2,Old3,Mi}) ->
ok = check_val(Mi,Old2,Old3),
#{ val1 := Old2, val2 := Old3 } = Mi,
{V2,V3, Mi#{ val1 := id(V2), val2 := V1, val2 => id(V3)}}
end, {none, none, #{val1=>none,val2=>none}},List),
ok.
get_val(#{ "wazzup" := _, val := V}) -> V;
get_val(#{ val := V }) -> {some_val, V}.
check_val(#{val1:=V1, val2:=V2},V1,V2) -> ok.
%% Use this function to avoid compile-time evaluation of an expression.
id(I) -> I.