# Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evalue import EValue from bu4.evaluation.targets.avtarget import AVTarget __all__ = ('AfterValue',) 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, AVChain): self.target.evaluable.evaluable = self.evaluable self.evaluable, self.target = self.target.evaluable.target.given( self.evaluable), self.target.target return self return self.target.given(self.evaluable) if isinstance(self.evaluable, AfterValue): self.evaluable, self.target = self.evaluable.evaluable, AVChain(self.evaluable, self.target) del self.target.evaluable.evaluable self.evaluable = self.evaluable.next() return self def __str__(self): return f'{self.evaluable}->{self.target}' class AVChain(AVTarget): def __init__(self, evaluable: AfterValue, target: AVTarget): if isinstance(evaluable.target, AVChain): raise TypeError self.evaluable = evaluable self.target = target def given(self, value: EValue) -> Evaluable: self.evaluable.evaluable = value return AfterValue(self.evaluable.target.given(value), self.target) def __str__(self): return f'{self.evaluable.target}->{self.target}'