Skip to content

Instantly share code, notes, and snippets.

@getadeo
Created October 31, 2013 12:18
Show Gist options
  • Save getadeo/7248734 to your computer and use it in GitHub Desktop.
Save getadeo/7248734 to your computer and use it in GitHub Desktop.
from greenlet import greenlet
from functools import update_wrapper
def iter_from_func(f, args, kwargs):
p = greenlet.getcurrent()
g = greenlet(lambda: f(lambda x: p.switch((x,)), *args, **kwargs), p)
while 1:
rv = g.switch()
if rv is None:
return
yield rv[0]
def funciter(f):
return update_wrapper(lambda *a, **kw: iter_from_func(f, a, kw), f)
@funciter
def my_enumerate(yield_func, iterable):
idx = 0
itereator = iter(iterable)
while 1:
yield_func((idx, iterator.next()))
idx += 1
@funciter
def my_enumerate(yield_func, iterable):
idx = 0
iterator = iter(iterable)
while 1:
yield_func((idx, iterator.next()))
idx += 1
>>>list(my_enumerate('abc'))
[(0,'a'), (1, 'b'), (2,'c')]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment