# Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.evaluation.av.aftervalue import AfterValue from bu4.evaluation.av.evtype import evtype from bu4.evaluation.constructs.eattachable import EAttachable from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.targets.avcall import AVCall from bu4.indexing.constructs.indexed import Indexed from bu4.parsing.codes import CODE_CALL 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__ = ('ICall',) class ICall(Indexed): def __init__(self, argument: Indexed, lambda_: Indexed): self.argument = argument self.lambda_ = lambda_ def attach(self, ev: evtype) -> Evaluable: return AfterValue(EAttachable(ev, self.lambda_), AVCall(EAttachable(ev, self.argument))) def __str__(self): return f'/{self.argument}{self.lambda_}' def bytes(self) -> TransformState[bytes]: return AfterTransform( TransformStart(lambda: self.argument.bytes()), ATLambda( lambda argument: AfterTransform( TransformStart(lambda: self.lambda_.bytes()), ATLambda( lambda lambda_: TransformFinished( bytes([CODE_CALL, *argument, *lambda_]) ) ) ) ) )