from twisted.internet import defer, reactor
from __future__ import generators


def unwrapDeferredGenerator(generator):
    deferred = generator.next()
    if deferred is None:
        return
    deferred.generator = generator
    deferred.addCallback(resultCallback, deferred)
    return deferred

def resultCallback(result, deferred):
    deferred.result = result
    unwrapDeferredGenerator(deferred.generator)
    return result

def generate():
    deferred = defer.Deferred()
    reactor.callLater(0.5, deferred.callback, "hello")
    yield deferred
    # When this function resumes, the result will be ready
    print deferred.result
    deferred = defer.Deferred()
    reactor.callLater(0.5, deferred.callback, "foo")
    yield deferred
    print deferred.result
    deferred = defer.Deferred()
    reactor.callLater(0.5, deferred.callback, "bar")
    yield deferred
    print deferred.result
    # Yield None to indicate this deferred generator is exhausted
    yield None    
    

unwrapDeferredGenerator(generate())


reactor.run()
