# Copyright (c) PARRRATE T&V 2021. All rights reserved. from typing import Type, Generic, TypeVar from bu4.evaluation.av.aftervalue import AfterValue from bu4.evaluation.constructs.evaluable import Evaluable from bu4.evaluation.constructs.evalue import EValue from bu4.evaluation.targets.avtarget import AVTarget __all__ = ('AVConvert',) T = TypeVar('T') class AVConvert(AVTarget, Generic[T]): def __init__(self, target_type: Type[T]): self.target_type = target_type def iterate(self, value: EValue) -> Evaluable: raise NotImplementedError def given_typed(self, value: T) -> Evaluable: raise NotImplementedError def given(self, value: EValue) -> Evaluable: if isinstance(value, self.target_type): return self.given_typed(value) else: return AfterValue(self.iterate(value), self) def __str__(self): return f'<{self.target_type}>'