40 lines
1.3 KiB
Python
40 lines
1.3 KiB
Python
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
|
|
|
|
from abc import ABC
|
|
from typing import TypeVar, Callable
|
|
|
|
from bu4.parsing.extensions.extension import Extension
|
|
from bu4.parsing.states.parsingread import ParsingRead
|
|
from bu4.parsing.targets.apendswith import APEndsWith
|
|
from bu4.transform.states.aftertransform import AfterTransform
|
|
from bu4.transform.states.transformfinished import TransformFinished
|
|
from bu4.transform.states.transformstate import TransformState
|
|
from bu4.transform.targets.atlambda import ATLambda
|
|
|
|
__all__ = ('CodeExtension',)
|
|
|
|
T = TypeVar('T')
|
|
|
|
|
|
class CodeExtension(Extension[T], ABC):
|
|
def __init_subclass__(cls, /, code: int = None):
|
|
super().__init_subclass__()
|
|
if code is None:
|
|
raise TypeError
|
|
cls.code = code
|
|
|
|
def readlambda(self, lambda_: Callable[[T], TransformState[T]]) -> TransformState[T]:
|
|
return AfterTransform(
|
|
ParsingRead(self.parser),
|
|
ATLambda(lambda_)
|
|
)
|
|
|
|
def readlambdafinished(self, lambda_: Callable[[T], T]) -> TransformState[T]:
|
|
return AfterTransform(
|
|
ParsingRead(self.parser),
|
|
ATLambda(lambda parsed: TransformFinished(lambda_(parsed)))
|
|
)
|
|
|
|
def endswith(self, expected: int, message: str):
|
|
return AfterTransform(ParsingRead(self.parser), APEndsWith(self.parser, expected, message))
|