def test_type_parameters_specialize(self): source_module = codegen.Module(name="MyModule") container_type = types.Type("Container a", source_module) specialized = container_type.specialize(a=dtypes.Int) specialized2 = container_type.specialize(a=dtypes.Int) self.assertEqual(specialized, specialized2) self.assertNotEqual(specialized, container_type)
def test_type_parameters_signatures(self): source_module = codegen.Module(name="MyModule") dict_type = types.Type("Dict k v", source_module) self.assertEqual(dict_type.as_signature(source_module), "Dict k v") env = types.SignatureEnv(used_type_variables={"k": 1, "v": 2}) self.assertEqual(dict_type.as_signature(source_module, env=env), "Dict k2 v2") dict_type = types.Type("Dict k v", source_module) str_to_float_dict = dict_type.specialize(k=dtypes.String, v=dtypes.Float) self.assertEqual(str_to_float_dict.as_signature(source_module), "Dict String Float") container_type = types.Type("Container a", source_module) complex_type = container_type.specialize(a=dict_type) self.assertEqual(complex_type.as_signature(source_module), "Container (Dict k v)")
def test_non_builtin_simple_types(self): source_module = codegen.Module(name="MyModule") mytype = types.Type("MyType", source_module) self.assertEqual(mytype.as_signature(source_module), "MyType") main_module = codegen.Module() main_module.add_import(source_module, "MyAlias") self.assertEqual(mytype.as_signature(main_module), "MyAlias.MyType")
def test_type_parameters_constructors(self): source_module = codegen.Module(name="MyModule") container_type = types.Type("Container a", source_module, constructors=["Empty", ("Single", "a")]) self.assertEqual(container_type.as_signature(source_module), "Container a") Empty = source_module.variables["Empty"] Single = source_module.variables["Single"] self.assertEqual(Empty.type.as_signature(source_module), "Container a") self.assertEqual(Single.type.as_signature(source_module), "a -> Container a")
"Sub", ] ) class DefaultImports(codegen.Scope): is_default_imports = True default_imports = DefaultImports() for i in ELM_DEFAULT_IMPORTS: default_imports.reserve_name(i) String = types.Type("String", default_imports) Float = types.Type("Float", default_imports) Int = types.Type("Int", default_imports) # 'number' is a hard-coded Elm 'type class', we can treat it as a simple type # for our purposes Number = types.Type("number", default_imports) Bool = types.Type("Bool", default_imports, constructors=["True", "False"]) Maybe = types.Type( "Maybe a", default_imports, constructors=["Nothing", ("Just", types.TypeParam("a"))]