# Copyright (c) PARRRATE T&V 2021. All rights reserved. from typing import TypeVar from bu4.transform.states.transformfinished import TransformFinished from bu4.transform.states.transformstate import TransformState from bu4.transform.targets.attarget import ATTarget __all__ = ('AfterTransform',) T = TypeVar('T') class AfterTransform(TransformState[T]): def __init__(self, state: TransformState[T], target: ATTarget[T]): self.state = state self.target = target def next(self) -> TransformState[T]: if isinstance(self.state, TransformFinished): return self.target.given(self.state.transformed) elif isinstance(self.state, AfterTransform): self.state, self.target = self.state.state, ATChain(self.state.target, self.target) else: self.state = self.state.next() return self class ATChain(ATTarget[T]): def __init__(self, target: ATTarget[T], aftertarget: ATTarget[T]): self.target = target self.aftertarget = aftertarget def given(self, transformed: T) -> TransformState[T]: return AfterTransform(self.target.given(transformed), self.aftertarget)