Skip to content

Instantly share code, notes, and snippets.

@jerith
Created July 7, 2015 16:44
Show Gist options
  • Select an option

  • Save jerith/8b33d3253b03f57625fa to your computer and use it in GitHub Desktop.

Select an option

Save jerith/8b33d3253b03f57625fa to your computer and use it in GitHub Desktop.
from twisted.internet.defer import Deferred
class Page(object):
def __init__(self, results, morefunc):
self.results = results
self._morefunc = morefunc
def next_page(self):
return self._morefunc()
class PageMaker(object):
def __init__(self, all_results, page_size):
self._all_results = all_results[:]
self._page_size = page_size
def get_page(self):
d = Deferred()
if not self._all_results:
d.callback(None)
else:
results = self._all_results[:self._page_size]
self._all_results[:self._page_size] = []
d.callback(Page(results, self.get_page))
return d
pm1 = PageMaker(range(10), 3)
# In the real world, this deferred probably won't have a result yet. We can
# cheat here because get_page() always calls d.callback().
page_d = pm1.get_page()
print "Deferred page:", page_d
page = page_d.result
while page is not None:
print "Page:", page, page.results
page_d = page.next_page()
print "Deferred page:", page_d
page = page_d.result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment