From ae9b8f8b163fa6c3f1ddcb5971c6c3d610a73683 Mon Sep 17 00:00:00 2001 From: Gaith Hallak Date: Thu, 24 Feb 2022 16:03:47 +0400 Subject: [PATCH] Make is_subtype/4 a separate function --- src/aeso_ast_infer_types.erl | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/src/aeso_ast_infer_types.erl b/src/aeso_ast_infer_types.erl index 2f0e32d..062affa 100644 --- a/src/aeso_ast_infer_types.erl +++ b/src/aeso_ast_infer_types.erl @@ -2747,16 +2747,9 @@ unify1(_Env, X, X, _Variance, _When) -> unify1(_Env, {id, _, Name}, {id, _, Name}, _Variance, _When) -> true; unify1(Env, A = {con, _, NameA}, B = {con, _, NameB}, Variance, When) -> - IsSubtype = case Variance of - invariant -> NameA == NameB; - covariant -> is_subtype(Env, NameA, NameB); - contravariant -> is_subtype(Env, NameB, NameA); - bivariant -> is_subtype(Env, NameA, NameB) - end, - if - IsSubtype -> - true; - true -> + case is_subtype(Env, NameA, NameB, Variance) of + true -> true; + false -> cannot_unify(A, B, When), false end; @@ -2803,6 +2796,15 @@ unify1(_Env, A, B, _Variance, When) -> cannot_unify(A, B, When), false. +is_subtype(Env, NameA, NameB, invariant) -> + NameA == NameB; +is_subtype(Env, NameA, NameB, covariant) -> + is_subtype(Env, NameA, NameB); +is_subtype(Env, NameA, NameB, contravariant) -> + is_subtype(Env, NameB, NameA); +is_subtype(Env, NameA, NameB, bivariant) -> + is_subtype(Env, NameA, NameB) orelse is_subtype(Env, NameB, NameA). + is_subtype(Env, Child, Base) -> Parents = maps:get(Child, Env#env.contract_parents, []), if