70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
from typing import Dict, Iterable, List, Mapping, Optional, Union
|
|
|
|
from .functions import (
|
|
Constraint_TypeClassInstanceExists,
|
|
ConstraintBase,
|
|
FunctionSignature,
|
|
TypeConstructorVariable,
|
|
TypeVariable,
|
|
TypeVariableContext,
|
|
)
|
|
from .types import Type3
|
|
|
|
|
|
class Type3ClassMethod:
|
|
__slots__ = ('name', 'signature', )
|
|
|
|
name: str
|
|
signature: FunctionSignature
|
|
|
|
def __init__(self, name: str, signature: FunctionSignature) -> None:
|
|
self.name = name
|
|
self.signature = signature
|
|
|
|
def __repr__(self) -> str:
|
|
return f'Type3ClassMethod({repr(self.name)}, {repr(self.signature)})'
|
|
|
|
class Type3Class:
|
|
__slots__ = ('name', 'args', 'methods', 'operators', 'inherited_classes', )
|
|
|
|
name: str
|
|
args: List[Union[TypeVariable, TypeConstructorVariable]]
|
|
methods: Dict[str, Type3ClassMethod]
|
|
operators: Dict[str, Type3ClassMethod]
|
|
inherited_classes: List['Type3Class']
|
|
|
|
def __init__(
|
|
self,
|
|
name: str,
|
|
args: Iterable[Union[TypeVariable, TypeConstructorVariable]],
|
|
methods: Mapping[str, Iterable[Union[Type3, TypeVariable, TypeConstructorVariable]]],
|
|
operators: Mapping[str, Iterable[Union[Type3, TypeVariable, TypeConstructorVariable]]],
|
|
inherited_classes: Optional[List['Type3Class']] = None,
|
|
additional_context: Optional[Mapping[str, Iterable[ConstraintBase]]] = None,
|
|
) -> None:
|
|
self.name = name
|
|
self.args = list(args)
|
|
|
|
context = TypeVariableContext()
|
|
context.constraints.append(Constraint_TypeClassInstanceExists(self, args))
|
|
|
|
self.methods = {
|
|
k: Type3ClassMethod(k, FunctionSignature(context, v))
|
|
for k, v in methods.items()
|
|
}
|
|
self.operators = {
|
|
k: Type3ClassMethod(k, FunctionSignature(context, v))
|
|
for k, v in operators.items()
|
|
}
|
|
self.inherited_classes = inherited_classes or []
|
|
|
|
if additional_context:
|
|
for func_name, constraint_list in additional_context.items():
|
|
func = self.methods.get(func_name) or self.operators.get(func_name)
|
|
assert func is not None # type hint
|
|
|
|
func.signature.context.constraints.extend(constraint_list)
|
|
|
|
def __repr__(self) -> str:
|
|
return self.name
|