Convert an internal iterator into an external in Python

from py.magic import greenlet

def make_iterator(func):
    g1 = greenlet.getcurrent()
    g2 = greenlet(lambda: func(lambda item: g1.switch((item,))), g1)
    while 1:
        rv = g2.switch()
        if not rv:
            return
        yield rv[0]

Example usage:

def my_internal_iterator(f):
    for item in xrange(10):
        f(item)

iterator = make_iterator(my_internal_iterator)
iterator.next() # yields 0
iterator.next() # yields 1

Leave a Reply

cogitations driven by wordpress