builtup4/bu4/evaluation/av/aftervalue.py

46 lines
1.6 KiB
Python

# 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}'