-module(maps_guard_fun).
-export([test/0]).
test() ->
F1 = fun
(#{s:=v,v:=V}) -> {v,V};
(#{s:=t,v:={V,V}}) -> {t,V};
(#{s:=l,v:=[V,V]}) -> {l,V}
end,
F2 = fun
(#{s:=T,v:={V,V}}) -> {T,V};
(#{s:=T,v:=[V,V]}) -> {T,V};
(#{s:=T,v:=V}) -> {T,V}
end,
V = <<"hi">>,
{v,V} = F1(#{s=>v,v=>V}),
{t,V} = F1(#{s=>t,v=>{V,V}}),
{l,V} = F1(#{s=>l,v=>[V,V]}),
{v,V} = F2(#{s=>v,v=>V}),
{t,V} = F2(#{s=>t,v=>{V,V}}),
{l,V} = F2(#{s=>l,v=>[V,V]}),
%% error case
case (catch F1(#{s=>none,v=>none})) of
{'EXIT', {function_clause,[{?MODULE,_,[#{s:=none,v:=none}],_}|_]}} -> ok;
{'EXIT', {function_clause,[{?MODULE,_,1,[#{s:=none,v:=none}]}|_]}} -> ok;
{'EXIT', {function_clause,[Frame|_]}}
when is_tuple(Frame), element(1, Frame) =:= ?MODULE ->
test_server:comment("Unexpected trace format, probably using HiPE");
{'EXIT', {{case_clause,_},_}} -> {comment,inlined};
Other ->
test_server:fail({no_match, Other})
end.