import abc from typing import Mapping from bu4.evaluation.evaluable import Evaluable try: from typing import TypeAlias except ImportError: TypeAlias = type envtype: TypeAlias = Mapping[bytes, 'AfterValue'] class AVTarget: def given(self, value: 'EValue') -> Evaluable: raise NotImplementedError class AfterValue(Evaluable): def __init__(self, evaluable: Evaluable, target: AVTarget): self.evaluable = evaluable self.target = target def next(self) -> 'Evaluable': if isinstance(self.evaluable, EValue): if isinstance(self.target, AVAV): self.evaluable, self.target = self.target.target.given(self.evaluable), self.target.aftertarget return self return self.target.given(self.evaluable) if isinstance(self.evaluable, AfterValue): self.evaluable, self.target = self.evaluable.evaluable, AVAV(self.evaluable.target, self.target) self.evaluable = self.evaluable.next() return self class AVAV(AVTarget): def __init__(self, target: AVTarget, aftertarget: AVTarget): self.target = target self.aftertarget = aftertarget def given(self, value: 'EValue') -> Evaluable: return AfterValue(self.target.given(value), self.aftertarget) class EValue(Evaluable, abc.ABC): def next(self) -> 'EValue': return self def call(self, argument: Evaluable) -> Evaluable: raise NotImplementedError