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