builtup4/bu4/indexing/constructs/ilambda.py
2021-09-12 13:33:13 +03:00

42 lines
1.4 KiB
Python

# 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])
)
)
)