class channel(object):
def __init__(self, gen):
self.gen = gen
self.args = ()
self.kwargs = {}
def __iter__(self):
return self
def next(self):
self.args = ()
self.kwargs = {}
return self.gen.next()
def send(self, *args, **kwargs):
self.args = args
self.kwargs = kwargs
return self.gen.next()
class channelgen(object):
def __init__(self, genfunc):
self.genfunc = genfunc
def __call__(self, *args, **kwargs):
c = channel(None)
c.gen = self.genfunc(c, *args, **kwargs)
return c
# A simple example
@channelgen
def skipper(chan, seq, skip = 0):
for i in seq:
if skip:
skip -= 1
else:
yield i
if chan.args:
skip = chan.args[0]
skip = skipper(xrange(100))
skip.next()
skip.next()
skip.send(10) # Skips ten items in the sequence before yeilding one