import abc
from .... import icurry
[docs]
class ModuleSpecification(abc.ABC):
TYPE_METADATA = {}
CONSTRUCTOR_METADATA = {}
FUNCTION_METADATA = {}
[docs]
def aliases(self):
return []
[docs]
def exports(self):
return []
[docs]
def extern(self):
return icurry.IModule(
name=self.NAME
, imports=self.IMPORTS
, types=self.types()
, functions=self.functions()
)
[docs]
def types(self):
for (typename, constructors) in self.TYPES:
yield icurry.IDataType(
'%s.%s' % (self.NAME, typename)
, [ icurry.IConstructor(
'%s.%s' % (self.NAME, ctorname)
, arity
, metadata=dict(md, **self.CONSTRUCTOR_METADATA.get((typename, i), {}))
)
for i,(ctorname, arity, md) in enumerate(constructors)
]
, modulename=self.NAME
, metadata=self.TYPE_METADATA.get(typename, {})
)
[docs]
def functions(self):
for name, arity, md in self.FUNCTIONS:
yield icurry.IFunction(
'%s.%s' % (self.NAME, name)
, arity
, modulename=self.NAME
, metadata=dict(md, **self.FUNCTION_METADATA.get(name, {}))
, body=icurry.IBuiltin()
)