%% -*- erlang-indent-level: 2 -*-
%%-------------------------------------------------------------------------
-module(maps_put_map_exact).
-export([test/0]).
test() ->
false = exact_guard(#{b => a}),
false = exact_guard(not_a_map),
true = exact_guard(#{a => false}),
#{a := true} = exact_update(#{a => false}),
{'EXIT', {{badmap, not_a_map}, [{?MODULE, exact_update, 1, _}|_]}}
= (catch exact_update(not_a_map)),
{'EXIT', {{badkey, a}, [{?MODULE, exact_update, 1, _}|_]}}
= (catch exact_update(#{})),
ok = exact_guard_clause(#{a => yes}),
{'EXIT', {function_clause, [{?MODULE, exact_guard_clause, _, _}|_]}}
= (catch exact_guard_clause(#{})),
{'EXIT', {function_clause, [{?MODULE, exact_guard_clause, _, _}|_]}}
= (catch exact_guard_clause(not_a_map)),
ok.
exact_guard(M) when is_map(M#{a := b}) -> true;
exact_guard(_) -> false.
exact_update(M) -> M#{a := true}.
exact_guard_clause(M) when is_map(M#{a := 42}) -> ok.