builtup4/bu4/linking/constructs/ldelayed.py

43 lines
1.4 KiB
Python

# Copyright (c) PARRRATE T&V 2021. All rights reserved.
from bu4.evaluation.constructs.eattachable import EAttachable
from bu4.evaluation.constructs.edelayed import EDelayed
from bu4.evaluation.constructs.evaluable import Evaluable
from bu4.indexing.constructs.idelayed import IDelayed
from bu4.indexing.constructs.indexed import Indexed
from bu4.linking.constructs.linked import Linked
from bu4.linking.evaluation.elvtype import elvtype
from bu4.transform.states.aftertransform import AfterTransform
from bu4.transform.states.transformfinished import TransformFinished
from bu4.transform.states.transformstart import TransformStart
from bu4.transform.states.transformstate import TransformState
from bu4.transform.targets.atlambda import ATLambda
__all__ = ('LDelayed',)
class LDelayed(Linked):
value: Linked
def __init__(self, value: Linked):
self.value = value
self.future = self.value.future
self.multifuture = self.future
def attach(self, env: elvtype) -> Evaluable:
return EDelayed(EAttachable(
env,
self.value
))
def index(self, promise: list[bytes]) -> TransformState[Indexed]:
return AfterTransform(
TransformStart(lambda: self.value.index(promise)),
ATLambda(
lambda value: TransformFinished(IDelayed(value))
)
)
def __str__(self):
return f'&{self.value}'