from bu4.codes import CODE_NAME, CODE_NULL from bu4.parsing.linked import Linked, LinkingState, Parsed from bu4.linking.linkingfinished import LinkingFinished from bu4.evaluation.aftervalue import envtype, Evaluable __all__ = ('LName', 'PName',) class LName(Linked): def __init__(self, promise: set[bytes], name: bytes): assert name in promise, f'undefined: {name}' self.name = name self.future = {name} def link(self) -> LinkingState: return LinkingFinished(self) def evaluable(self, env: envtype) -> Evaluable: return env[self.name] def __str__(self): return f'[{self.name.decode()}]' def unlink(self) -> Parsed: return PName(self.name) class PName(Parsed): def __init__(self, name: bytes): self.name = name def link(self, promise: set[bytes]) -> Linked: return LName(promise, self.name) def __bytes__(self): return bytes([CODE_NAME, *self.name, CODE_NULL])