comparison mercurial/revset.py @ 22798:586d7058ea48

generatorset: get list-based fast iterations after the generator is consumed When all revisions are known, we shortcut most of the class logic to use list iteration instead. The cost of the sort is expected to be non-significant. The list creation and sorting could be done lazily in the future. We have to copy the list to not break existing iterator created before we finished consuming the generator.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Fri, 03 Oct 2014 21:01:30 -0700
parents 61ecabeeadb3
children bafa371d7af3
comparison
equal deleted inserted replaced
22797:61ecabeeadb3 22798:586d7058ea48
2619 def __init__(self, gen, iterasc=None): 2619 def __init__(self, gen, iterasc=None):
2620 """ 2620 """
2621 gen: a generator producing the values for the generatorset. 2621 gen: a generator producing the values for the generatorset.
2622 """ 2622 """
2623 self._gen = gen 2623 self._gen = gen
2624 self._asclist = None
2624 self._cache = {} 2625 self._cache = {}
2625 self._genlist = [] 2626 self._genlist = []
2626 self._finished = False 2627 self._finished = False
2627 if iterasc is not None: 2628 if iterasc is not None:
2628 if iterasc: 2629 if iterasc:
2710 genlist = self._genlist.append 2711 genlist = self._genlist.append
2711 for item in self._gen: 2712 for item in self._gen:
2712 cache[item] = True 2713 cache[item] = True
2713 genlist(item) 2714 genlist(item)
2714 yield item 2715 yield item
2715 self._finished = True 2716 if not self._finished:
2717 self._finished = True
2718 asc = self._genlist[:]
2719 asc.sort()
2720 self._asclist = asc
2721 self.fastasc = asc.__iter__
2722 self.fastdesc = asc.__reversed__
2716 2723
2717 def set(self): 2724 def set(self):
2718 return self 2725 return self
2719 2726
2720 def sort(self, reverse=False): 2727 def sort(self, reverse=False):