def instantiated_generic_structural_type_is_sub_type_of_other_instantiated_generic_structural_type_if_it_has_matching_attributes(self): iterator = types.generic_structural_type("iterator", [types.covariant("T")], lambda T: [ types.attr("__iter__", types.func([], iterator(T))), types.attr("__next__", types.func([], T)), ]) iterable = types.generic_structural_type("iterable", [types.covariant("T")], lambda T: [ types.attr("__iter__", types.func([], iterator(T))), ]) assert types.is_sub_type( iterable(types.int_type), iterator(types.int_type), )
def type_is_instance_of_generic_type_when_type_is_direct_instantiation(self): generic_type = types.generic_structural_type("box", ["T"], lambda T: [ types.attr("value", T) ]) class_type = types.class_type("boxed_int", [types.attr("value", "int")]) assert generic_type.is_instantiated_type(generic_type(types.int_type)) assert not generic_type.is_instantiated_type(class_type)
def recursive_instantiated_generic_structural_type_is_sub_type_of_same_instantiated_generic_structural_type_if_it_has_matching_attributes(self): recursive = types.generic_structural_type("recursive", [types.covariant("T")], lambda T: [ types.attr("__iter__", types.func([], recursive(T))), ]) assert types.is_sub_type( recursive(types.int_type), recursive(types.int_type), )
def invariant_type_parameter_can_be_unified_when_part_of_recursive_structural_type(self): invariant_type_param = types.invariant("T") recursive = types.generic_structural_type("recursive", [types.covariant("T")], lambda T: [ types.attr("__iter__", types.func([], recursive(T))), ]) assert types.is_sub_type( recursive(invariant_type_param), recursive(types.int_type), unify=[invariant_type_param] )
def instantiating_type_replaces_type_in_attributes(self): generic_type = types.generic_structural_type("box", ["T"], lambda T: [ types.attr("value", T) ]) assert_equal(int_type, generic_type(int_type).attrs.type_of("value"))