2175 |
2175 |
2176 def set(self): |
2176 def set(self): |
2177 return set([r for r in self]) |
2177 return set([r for r in self]) |
2178 |
2178 |
2179 class generatorset(object): |
2179 class generatorset(object): |
2180 """Wrapper structure for generators that provides lazy membership.""" |
2180 """Wrapper structure for generators that provides lazy membership and can |
|
2181 be iterated more than once. |
|
2182 When asked for membership it generates values until either it finds the |
|
2183 requested one or has gone through all the elements in the generator |
|
2184 """ |
2181 def __init__(self, gen): |
2185 def __init__(self, gen): |
2182 self._gen = gen |
2186 self._gen = gen |
2183 self._iter = iter(gen) |
2187 self._iter = iter(gen) |
2184 self._cache = {} |
2188 self._cache = {} |
|
2189 self._genlist = baseset([]) |
|
2190 self._iterated = False |
|
2191 |
|
2192 def _nextitem(self): |
|
2193 l = self._iter.next() |
|
2194 self._cache[l] = True |
|
2195 self._genlist.append(l) |
|
2196 return l |
2185 |
2197 |
2186 def __contains__(self, x): |
2198 def __contains__(self, x): |
2187 if x in self._cache: |
2199 if x in self._cache: |
2188 return self._cache[x] |
2200 return self._cache[x] |
2189 |
2201 |
|
2202 self._iterated = True |
2190 while True: |
2203 while True: |
2191 try: |
2204 try: |
2192 l = self._iter.next() |
2205 l = self._nextitem() |
2193 self._cache[l] = True |
|
2194 if l == x: |
2206 if l == x: |
2195 return True |
2207 return True |
2196 except (StopIteration): |
2208 except (StopIteration): |
2197 break |
2209 break |
2198 |
2210 |
2199 self._cache[x] = False |
2211 self._cache[x] = False |
2200 return False |
2212 return False |
2201 |
2213 |
2202 def __iter__(self): |
2214 def __iter__(self): |
2203 for item in self._gen: |
2215 if self._iterated: |
2204 self._cache[item] = True |
2216 for l in self._genlist: |
2205 yield item |
2217 yield l |
|
2218 while True: |
|
2219 try: |
|
2220 item = self._nextitem() |
|
2221 yield item |
|
2222 except (StopIteration): |
|
2223 break |
|
2224 else: |
|
2225 self._iterated = True |
|
2226 for item in self._gen: |
|
2227 self._cache[item] = True |
|
2228 self._genlist.append(item) |
|
2229 yield item |
2206 |
2230 |
2207 def set(self): |
2231 def set(self): |
2208 return self |
2232 return self |
2209 |
2233 |
2210 class spanset(object): |
2234 class spanset(object): |