# Coroutine example:  controlling multiple instances of a single function

from Coroutine import *

# fringe visits a nested list in inorder, and detaches for each non-list
# element; raises EarlyExit after the list is exhausted
def fringe(co, list):
    for x in list:
        if type(x) is type([]):
            fringe(co, x)
        else:
            co.back(x)

def printinorder(list):
    co = Coroutine()
    f = co.create(fringe, co, list)
    try:
        while 1:
            print(co.tran(f), end=' ')
    except EarlyExit:
        pass
    print()

printinorder([1,2,3])  # 1 2 3
printinorder([[[[1,[2]]],3]]) # ditto
x = [0, 1, [2, [3]], [4,5], [[[6]]] ]
printinorder(x) # 0 1 2 3 4 5 6

# fcmp lexicographically compares the fringes of two nested lists
def fcmp(l1, l2):
    co1 = Coroutine(); f1 = co1.create(fringe, co1, l1)
    co2 = Coroutine(); f2 = co2.create(fringe, co2, l2)
    while 1:
        try:
            v1 = co1.tran(f1)
        except EarlyExit:
            try:
                v2 = co2.tran(f2)
            except EarlyExit:
                return 0
            co2.kill()
            return -1
        try:
            v2 = co2.tran(f2)
        except EarlyExit:
            co1.kill()
            return 1
        if v1 != v2:
            co1.kill(); co2.kill()
            return cmp(v1,v2)

print(fcmp(range(7), x))  #  0; fringes are equal
print(fcmp(range(6), x))  # -1; 1st list ends early
print(fcmp(x, range(6)))  #  1; 2nd list ends early
print(fcmp(range(8), x))  #  1; 2nd list ends early
print(fcmp(x, range(8)))  # -1; 1st list ends early
print(fcmp([1,[[2],8]],
           [[[1],2],8]))  #  0
print(fcmp([1,[[3],8]],
           [[[1],2],8]))  #  1
print(fcmp([1,[[2],8]],
           [[[1],2],9]))  # -1

# end of example
