from bu4.linking.afterlinking import AfterLinking from bu4.linking.alal import ALAL from bu4.parsing.linked import LinkingState, Linked from bu4.linking.linkingfinished import LinkingFinished from bu4.linking.linkingparsed import LinkingParsed 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, ALAL(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