~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/services/utils.py

  • Committer: Launchpad Patch Queue Manager
  • Date: 2011-02-08 20:34:23 UTC
  • mfrom: (12336.1.2 better-caching-iterator)
  • Revision ID: launchpad@pqm.canonical.com-20110208203423-i7ape1oqyjra35v2
[r=leonardr][no-qa] Use itertools.tee() to simplify and speed up
        CachingIterator.

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
    'value_string',
19
19
    ]
20
20
 
 
21
from itertools import tee
21
22
from textwrap import dedent
22
 
import itertools
23
23
 
24
24
from lazr.enum import BaseItem
25
25
from twisted.python.util import mergeFunctionMetadata
123
123
 
124
124
    def __init__(self, iterator):
125
125
        self.iterator = iterator
126
 
        self.data = []
127
126
 
128
127
    def __iter__(self):
129
 
        index = itertools.count()
130
 
        while True:
131
 
            pos = index.next()
132
 
            try:
133
 
                yield self.data[pos]
134
 
            except IndexError:
135
 
                # Defer to the iterator.
136
 
                pass
137
 
            else:
138
 
                continue
139
 
            if self.iterator is None:
140
 
                break
141
 
            try:
142
 
                item = self.iterator.next()
143
 
            except StopIteration:
144
 
                self.iterator = None
145
 
                break
146
 
            self.data.append(item)
147
 
            yield item
 
128
        # Teeing an iterator previously returned by tee won't cause heat
 
129
        # death. See tee_copy in itertoolsmodule.c in the Python source.
 
130
        self.iterator, iterator = tee(self.iterator)
 
131
        return iterator
148
132
 
149
133
 
150
134
def decorate_with(context_factory, *args, **kwargs):