comparison mercurial/revset.py @ 20657:379e89e4b079

revset: added order methods to lazyset classes This will allow revsets to ask for an ordered set when possible to be able to work lazily with it.
author Lucas Moscovicz <lmoscovicz@fb.com>
date Fri, 07 Feb 2014 08:44:18 -0800
parents 7fc371d2e5a3
children d7e96dd8e995
comparison
equal deleted inserted replaced
20656:cdecbc5ab504 20657:379e89e4b079
2144 """ 2144 """
2145 def __init__(self, data): 2145 def __init__(self, data):
2146 super(baseset, self).__init__(data) 2146 super(baseset, self).__init__(data)
2147 self._set = None 2147 self._set = None
2148 2148
2149 def ascending(self):
2150 self.sort()
2151
2152 def descending(self):
2153 self.sort(reverse=True)
2154
2149 def set(self): 2155 def set(self):
2150 if not self._set: 2156 if not self._set:
2151 self._set = set(self) 2157 self._set = set(self)
2152 return self._set 2158 return self._set
2153 2159
2178 """ 2184 """
2179 def __init__(self, subset, condition=lambda x: True): 2185 def __init__(self, subset, condition=lambda x: True):
2180 self._subset = subset 2186 self._subset = subset
2181 self._condition = condition 2187 self._condition = condition
2182 self._cache = {} 2188 self._cache = {}
2189
2190 def ascending(self):
2191 self._subset.sort()
2192
2193 def descending(self):
2194 self._subset.sort(reverse=True)
2183 2195
2184 def __contains__(self, x): 2196 def __contains__(self, x):
2185 c = self._cache 2197 c = self._cache
2186 if x not in c: 2198 if x not in c:
2187 c[x] = x in self._subset and self._condition(x) 2199 c[x] = x in self._subset and self._condition(x)
2247 self._ascending = ascending 2259 self._ascending = ascending
2248 2260
2249 def filter(self, l): 2261 def filter(self, l):
2250 return orderedlazyset(self, l, ascending=self._ascending) 2262 return orderedlazyset(self, l, ascending=self._ascending)
2251 2263
2264 def ascending(self):
2265 if not self._ascending:
2266 self.reverse()
2267
2268 def descending(self):
2269 if self._ascending:
2270 self.reverse()
2271
2252 def __and__(self, x): 2272 def __and__(self, x):
2253 return orderedlazyset(self, lambda r: r in x, 2273 return orderedlazyset(self, lambda r: r in x,
2254 ascending=self._ascending) 2274 ascending=self._ascending)
2255 2275
2256 def __sub__(self, x): 2276 def __sub__(self, x):
2257 return orderedlazyset(self, lambda r: r not in x, 2277 return orderedlazyset(self, lambda r: r not in x,
2258 ascending=self._ascending) 2278 ascending=self._ascending)
2279
2280 def reverse(self):
2281 self._subset.reverse()
2282 self._ascending = not self._ascending
2259 2283
2260 class generatorset(object): 2284 class generatorset(object):
2261 """Wrapper structure for generators that provides lazy membership and can 2285 """Wrapper structure for generators that provides lazy membership and can
2262 be iterated more than once. 2286 be iterated more than once.
2263 When asked for membership it generates values until either it finds the 2287 When asked for membership it generates values until either it finds the
2339 if end is not None: 2363 if end is not None:
2340 self._end = end 2364 self._end = end
2341 else: 2365 else:
2342 self._end = len(repo) 2366 self._end = len(repo)
2343 self._hiddenrevs = repo.changelog.filteredrevs 2367 self._hiddenrevs = repo.changelog.filteredrevs
2368
2369 def ascending(self):
2370 if self._start > self._end:
2371 self.reverse()
2372
2373 def descending(self):
2374 if self._start < self._end:
2375 self.reverse()
2344 2376
2345 def _contained(self, rev): 2377 def _contained(self, rev):
2346 return (rev <= self._start and rev > self._end) or (rev >= self._start 2378 return (rev <= self._start and rev > self._end) or (rev >= self._start
2347 and rev < self._end) 2379 and rev < self._end)
2348 2380