git.fiddlerwoaroof.com
Raw Blame History
def wrapper(func):
    def _inner(a):
        results = []
        results.append(func(a))
        v = results[0].next()
        idx = 0
        while True:
            if not isinstance(v, Result):
                results.append(func(v))
                idx = len(results) - 1
                v = results[idx].next()
            else:
                del results[idx]
                if len(results) == 0: break
                else:
                    idx -= 1
                    v = results[idx].send(v.v)
        return v.v
    return _inner

@wrapper
def fact(a):
    if a == 1:
        yield Result(1)
    yield Result(a * (yield a-1))

@wrapper
def count(a):
    if a == []: yield Result(0)
    else:
        yield Result(1 + (yield a[1:]))

@wrapper
def fib(a):
    if a in [1,2]: yield Result(1)
    else:
        z = (yield a-1)
        b = (yield a-2)
        yield Result( z + b )

@wrapper
def fib(a):
    if a in [1,2]: yield Result(1)
    else:
        z = (yield a-1)
        b = (yield a-2)
        yield Result( z + b )


@wrapper
def reverse(lis):
    if lis == []: yield Result([])
    else:
        yield Result( [(yield lis[1:]), lis[0]] )