Example #1
0
    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),
        )
Example #2
0
 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)
Example #3
0
 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),
     )
Example #4
0
 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]
     )
Example #5
0
 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"))