27 lines
924 B
Python
27 lines
924 B
Python
class VarianceManager:
|
|
def __init__(self, types: TypesRegistry) -> None:
|
|
self.types: TypesRegistry = types
|
|
self._queue: list[str] = []
|
|
self._inferred: set[str] = set()
|
|
|
|
def infer_all(self):
|
|
for name, type in self.types._types.items():
|
|
if isinstance(type, GenericType):
|
|
self.infer(name, type)
|
|
|
|
def infer(self, name: str, type: GenericType) -> GenericType:
|
|
if self.is_inferred(name):
|
|
return type
|
|
self._queue.append(name)
|
|
inferrer: VarianceInferrer = VarianceInferrer(self)
|
|
inferred: GenericType = inferrer.infer(type)
|
|
self.types._types[name] = inferred
|
|
self._queue.pop()
|
|
self._inferred.add(name)
|
|
return inferred
|
|
|
|
def is_in_queue(self, name: str) -> bool:
|
|
return name in self._queue
|
|
|
|
def is_inferred(self, name: str) -> bool:
|
|
return name in self._inferred |