# Copyright (c) PARRRATE T&V 2021. All rights reserved. from typing import Mapping, Iterator from bu4.evaluation.av.aftervalue import AfterValue from bu4.evaluation.av.envtype import envtype from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.targets.avcontainer import AVContainer __all__ = ('LambdaEnv',) class LambdaEnv(Mapping): def __getitem__(self, k: bytes) -> AfterValue: 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[AfterValue]: yield self.name yield from self.env def __init__(self, env: envtype, name: bytes, evaluable: Evaluable): self.env = env self.name = name self.container = AVContainer(evaluable).after_value