# Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.encoding.codes import CODE_MAKE from bu4.evaluation.constructs.evaluable import Evaluable from bu4.indexing.constructs.indexed import Indexed from bu4.indexing.evaluation.eilambda import EILambda from bu4.indexing.evaluation.eivtype import eivtype 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__ = ('ILambda',) class ILambda(Indexed): def __init__(self, value: Indexed, table: list[int], *, memoize: bool): self.value = value self.table = table self.memoize = memoize def attach(self, ev: eivtype) -> Evaluable: return EILambda( [ev[i] for i in self.table], self.value, memoize=self.memoize ) def __str__(self): return f'(0){self.value}' def bytes(self) -> TransformState[bytes]: return AfterTransform( TransformStart(lambda: self.value.bytes()), ATLambda( lambda value: TransformFinished( bytes([CODE_MAKE, self.memoize, len(self.table), *self.table, *value]) ) ) )