51 lines
1.4 KiB
Python
51 lines
1.4 KiB
Python
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
|