33 lines
1.2 KiB
Python
33 lines
1.2 KiB
Python
# Copyright (c) PARRRATE T&V 2021. All rights reserved.
|
|
|
|
from bu4.linking.states.afterlinking import AfterLinking
|
|
from bu4.linking.states.linkingfinished import LinkingFinished
|
|
from bu4.linking.states.linkingparsed import LinkingParsed
|
|
from bu4.linking.states.linkingstate import LinkingState
|
|
from bu4.linking.targets.alchain import ALChain
|
|
from bu4.linking.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)
|
|
else:
|
|
raise TypeError
|
|
return state
|
|
|
|
|
|
def prepare(state: LinkingState) -> Linked:
|
|
while True:
|
|
if isinstance(state, LinkingFinished):
|
|
return state.linked
|
|
elif isinstance(state, AfterLinking):
|
|
state = _afterlinking_iteration(state)
|
|
else:
|
|
raise TypeError
|