# Copyright (c) PARRRATE T&V 2021. All rights reserved. from bu4.linking.states.afterlinking import AfterLinking from bu4.linking.targets.alchain import ALChain from bu4.linking.states.linkingfinished import LinkingFinished from bu4.linking.states.linkingparsed import LinkingParsed from bu4.linking.states.linkingstate import LinkingState from bu4.parsing.constructs.linked import Linked __all__ = ('prepare',) def _afterlinking_iteration(state: AfterLinking) -> LinkingState: if isinstance(state.state, LinkingFinished): state = state.target.given(state.state.linked) elif isinstance(state.state, AfterLinking): state.state, state.target = state.state.state, ALChain(state.state.target, state.target) elif isinstance(state.state, LinkingParsed): state.state = state.state.parsed.link(state.state.promise).link() else: raise TypeError return state def prepare(linked: Linked) -> Linked: state = linked.link() while True: if isinstance(state, LinkingFinished): return state.linked elif isinstance(state, AfterLinking): state = _afterlinking_iteration(state) else: raise TypeError