From patchwork Sun May 17 23:00:44 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [2,of,2] revset: extract addset._iterordered to free function From: Yuya Nishihara X-Patchwork-Id: 9122 Message-Id: <2995144081f90eac17f7.1431903644@mimosa> To: mercurial-devel@selenic.com Date: Mon, 18 May 2015 08:00:44 +0900 # HG changeset patch # User Yuya Nishihara # Date 1431780129 -32400 # Sat May 16 21:42:09 2015 +0900 # Node ID 2995144081f90eac17f7aef80ee868c53f533717 # Parent caa306fbcfcea29fa9683cf646d43ddeb4d52477 revset: extract addset._iterordered to free function It never uses self, so let's make it less dependent on variables. diff --git a/mercurial/revset.py b/mercurial/revset.py --- a/mercurial/revset.py +++ b/mercurial/revset.py @@ -2935,6 +2935,42 @@ class filteredset(abstractsmartset): def __repr__(self): return '<%s %r>' % (type(self).__name__, self._subset) +def _iterordered(ascending, iter1, iter2): + """produce an ordered iteration from two iterators with the same order + + The ascending is used to indicated the iteration direction. + """ + choice = max + if ascending: + choice = min + + val1 = None + val2 = None + try: + # Consume both iterators in an ordered way until one is empty + while True: + if val1 is None: + val1 = iter1.next() + if val2 is None: + val2 = iter2.next() + next = choice(val1, val2) + yield next + if val1 == next: + val1 = None + if val2 == next: + val2 = None + except StopIteration: + # Flush any remaining values and consume the other one + it = iter2 + if val1 is not None: + yield val1 + it = iter1 + elif val2 is not None: + # might have been equality and both are empty + yield val2 + for val in it: + yield val + class addset(abstractsmartset): """Represent the addition of two sets @@ -3068,7 +3104,7 @@ class addset(abstractsmartset): iter2 = iter(sorted(self._r2, reverse=not self._ascending)) else: iter2 = iter2() - return self._iterordered(self._ascending, iter1, iter2) + return _iterordered(self._ascending, iter1, iter2) def _trysetasclist(self): """populate the _asclist attribute if possible and necessary""" @@ -3084,7 +3120,7 @@ class addset(abstractsmartset): iter2 = self._r2.fastasc if None in (iter1, iter2): return None - return lambda: self._iterordered(True, iter1(), iter2()) + return lambda: _iterordered(True, iter1(), iter2()) @property def fastdesc(self): @@ -3095,44 +3131,7 @@ class addset(abstractsmartset): iter2 = self._r2.fastdesc if None in (iter1, iter2): return None - return lambda: self._iterordered(False, iter1(), iter2()) - - def _iterordered(self, ascending, iter1, iter2): - """produce an ordered iteration from two iterators with the same order - - The ascending is used to indicated the iteration direction. - """ - choice = max - if ascending: - choice = min - - val1 = None - val2 = None - try: - # Consume both iterators in an ordered way until one is - # empty - while True: - if val1 is None: - val1 = iter1.next() - if val2 is None: - val2 = iter2.next() - next = choice(val1, val2) - yield next - if val1 == next: - val1 = None - if val2 == next: - val2 = None - except StopIteration: - # Flush any remaining values and consume the other one - it = iter2 - if val1 is not None: - yield val1 - it = iter1 - elif val2 is not None: - # might have been equality and both are empty - yield val2 - for val in it: - yield val + return lambda: _iterordered(False, iter1(), iter2()) def __contains__(self, x): return x in self._r1 or x in self._r2