comparison mercurial/revset.py @ 20705:9cc2249a9461

revset: made generatorset a private class This class are not supposed to be used outside revset.py since it only wraps content that is used by baseset typed classes. It only gets created by revset operations or private methods.
author Lucas Moscovicz <lmoscovicz@fb.com>
date Wed, 12 Mar 2014 17:07:38 -0700
parents e07b1fd30805
children efb34b066e7a
comparison
equal deleted inserted replaced
20704:623ed0ed793e 20705:9cc2249a9461
2323 yield r 2323 yield r
2324 s = self._r1.set() 2324 s = self._r1.set()
2325 for r in self._r2: 2325 for r in self._r2:
2326 if r not in s: 2326 if r not in s:
2327 yield r 2327 yield r
2328 self._iter = generatorset(gen()) 2328 self._iter = _generatorset(gen())
2329 2329
2330 return self._iter 2330 return self._iter
2331 2331
2332 def __iter__(self): 2332 def __iter__(self):
2333 for r in self._iterator(): 2333 for r in self._iterator():
2334 yield r 2334 yield r
2335 2335
2336 def __contains__(self, x): 2336 def __contains__(self, x):
2337 return x in self._r1 or x in self._r2 2337 return x in self._r1 or x in self._r2
2338 2338
2339 class generatorset(object): 2339 class _generatorset(object):
2340 """Wrapper structure for generators that provides lazy membership and can 2340 """Wrap a generator for lazy iteration
2341
2342 Wrapper structure for generators that provides lazy membership and can
2341 be iterated more than once. 2343 be iterated more than once.
2342 When asked for membership it generates values until either it finds the 2344 When asked for membership it generates values until either it finds the
2343 requested one or has gone through all the elements in the generator 2345 requested one or has gone through all the elements in the generator
2346
2347 This class does not duck-type baseset and it's only supposed to be used
2348 internally
2344 """ 2349 """
2345 def __init__(self, gen): 2350 def __init__(self, gen):
2346 self._gen = gen 2351 self._gen = gen
2347 self._iter = iter(gen) 2352 self._iter = iter(gen)
2348 self._cache = {} 2353 self._cache = {}
2384 if not self._finished: 2389 if not self._finished:
2385 for i in self: 2390 for i in self:
2386 continue 2391 continue
2387 self._genlist.sort(reverse=reverse) 2392 self._genlist.sort(reverse=reverse)
2388 2393
2389 class ascgeneratorset(generatorset): 2394 class ascgeneratorset(_generatorset):
2390 """ Same structure as generatorset but stops iterating after it goes past 2395 """ Same structure as _generatorset but stops iterating after it goes past
2391 the value when asked for membership and the element is not contained 2396 the value when asked for membership and the element is not contained
2392 """ 2397 """
2393 def __contains__(self, x): 2398 def __contains__(self, x):
2394 if x in self._cache: 2399 if x in self._cache:
2395 return self._cache[x] 2400 return self._cache[x]
2401 break 2406 break
2402 2407
2403 self._cache[x] = False 2408 self._cache[x] = False
2404 return False 2409 return False
2405 2410
2406 class descgeneratorset(generatorset): 2411 class descgeneratorset(_generatorset):
2407 """ Same structure as generatorset but stops iterating after it goes past 2412 """ Same structure as _generatorset but stops iterating after it goes past
2408 the value when asked for membership and the element is not contained 2413 the value when asked for membership and the element is not contained
2409 """ 2414 """
2410 def __contains__(self, x): 2415 def __contains__(self, x):
2411 if x in self._cache: 2416 if x in self._cache:
2412 return self._cache[x] 2417 return self._cache[x]