Polymorphism support #848

Merged
ghallak merged 53 commits from ghallak/307 into master 2022-06-17 18:09:07 +09:00
Showing only changes of commit 2883b41beb - Show all commits

View File

@ -1157,17 +1157,13 @@ infer_type_vars_variance(TypeParams, Cons) ->
Vs = lists:flatten([infer_type_vars_variance(Arg) || Arg <- FlatArgs]), Vs = lists:flatten([infer_type_vars_variance(Arg) || Arg <- FlatArgs]),
lists:map(fun({tvar, _, TVar}) -> lists:map(fun({tvar, _, TVar}) ->
S = sets:from_list([Variance || {TV, Variance} <- Vs, TV == TVar]), S = sets:from_list([Variance || {TV, Variance} <- Vs, TV == TVar]),
IsInvariant = sets:is_element(invariant, S),
IsCovariant = sets:is_element(covariant, S), IsCovariant = sets:is_element(covariant, S),
IsContravariant = sets:is_element(contravariant, S), IsContravariant = sets:is_element(contravariant, S),
IsBivariant = sets:is_element(bivariant, S), case {IsCovariant, IsContravariant} of
case {IsInvariant, IsCovariant, IsContravariant, IsBivariant} of {true, true} -> invariant;
{true, _, _, _} -> invariant; {true, false} -> covariant;
{false, true, true, _} -> invariant; {false, true} -> contravariant;
{false, _, _, true} -> bivariant; {false, false} -> bivariant
{false, true, false, _} -> covariant;
{false, false, true, _} -> contravariant;
_ -> invariant
end end
end, TypeParams). end, TypeParams).