comparison mercurial/revset.py @ 20536:532b114a6e02

revset: added generatorset class with cached __contains__ method
author Lucas Moscovicz <lmoscovicz@fb.com>
date Wed, 05 Feb 2014 15:23:11 -0800
parents 4849f574aa24
children fe220013e4db
comparison
equal deleted inserted replaced
20534:4849f574aa24 20536:532b114a6e02
2174 self._subset.reverse() 2174 self._subset.reverse()
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):
2180 """Wrapper structure for generators that provides lazy membership."""
2181 def __init__(self, gen):
2182 self._gen = gen
2183 self._iter = iter(gen)
2184 self._cache = {}
2185
2186 def __contains__(self, x):
2187 if x in self._cache:
2188 return self._cache[x]
2189
2190 while True:
2191 try:
2192 l = self._iter.next()
2193 self._cache[l] = True
2194 if l == x:
2195 return True
2196 except (StopIteration):
2197 break
2198
2199 self._cache[x] = False
2200 return False
2201
2202 def __iter__(self):
2203 for item in self._gen:
2204 self._cache[item] = True
2205 yield item
2206
2207 def set(self):
2208 return self
2209
2179 class spanset(object): 2210 class spanset(object):
2180 """Duck type for baseset class which represents a range of revisions and 2211 """Duck type for baseset class which represents a range of revisions and
2181 can work lazily and without having all the range in memory 2212 can work lazily and without having all the range in memory
2182 """ 2213 """
2183 def __init__(self, repo, start=0, end=None): 2214 def __init__(self, repo, start=0, end=None):