# Copyright (c) PARRRATE T&V 2021. All rights reserved. from typing import Mapping, Iterator from bu4.evaluation.av.envtype import envtype from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.targets.avnamedcontainer import AVNamedContainer __all__ = ('LambdaEnv',) class LambdaEnv(Mapping[bytes, Evaluable]): def __getitem__(self, k: bytes) -> Evaluable: if k == self.name: return self.container else: return self.env[k] def __len__(self) -> int: return len(self.env) + 1 def __iter__(self) -> Iterator[Evaluable]: yield self.name yield from self.env def __init__(self, env: envtype, name: bytes, evaluable: Evaluable, *, memoize): self.env = env self.name = name self.container = AVNamedContainer(evaluable, name).after_value if memoize else evaluable @staticmethod def strfy(self): return ''.join(f'\x7b{evaluable}|{name.decode()}\x7d' for name, evaluable in self.items()) def __str__(self): return self.strfy(self)