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