lazyset: add order awareness to the class
authorPierre-Yves David <pierre-yves.david@fb.com>
Thu, 02 Oct 2014 19:14:03 -0500
changeset 22725 88e5483bfb20
parent 22724 abdb46cf3b38
child 22726 169aa5e74b52
lazyset: add order awareness to the class Just a bit of extra code makes the lazyset aware of order. This renders orderedlazyset useless. At some point, the `subset` will become responsible for this ordering logic. But we are not there yet because the various objects used as subsets are not good enough.
mercurial/revset.py
--- a/mercurial/revset.py	Thu Oct 02 19:03:14 2014 -0500
+++ b/mercurial/revset.py	Thu Oct 02 19:14:03 2014 -0500
@@ -2409,7 +2409,7 @@
     the subset and contains a function which tests for membership in the
     revset
     """
-    def __init__(self, subset, condition=lambda x: True):
+    def __init__(self, subset, condition=lambda x: True, ascending=None):
         """
         condition: a function that decide whether a revision in the subset
                    belongs to the revset or not.
@@ -2417,6 +2417,9 @@
         self._subset = subset
         self._condition = condition
         self._cache = {}
+        if ascending is not None:
+            ascending = bool(ascending)
+        self._ascending = ascending
 
     def __contains__(self, x):
         c = self._cache
@@ -2473,21 +2476,27 @@
         return l[x]
 
     def sort(self, reverse=False):
-        if not util.safehasattr(self._subset, 'sort'):
-            self._subset = baseset(self._subset)
-        self._subset.sort(reverse=reverse)
+        if self._ascending is None:
+            if not util.safehasattr(self._subset, 'sort'):
+                self._subset = baseset(self._subset)
+            self._subset.sort(reverse=reverse)
+            self._ascending = not reverse
+        elif bool(reverse) == self._ascending:
+            self.reverse()
 
     def reverse(self):
         self._subset.reverse()
+        if self._ascending is not None:
+            self._ascending = not self._ascending
 
     def set(self):
         return set([r for r in self])
 
     def isascending(self):
-        return False
+        return self._ascending is not None and self._ascending
 
     def isdescending(self):
-        return False
+        return self._ascending is not None and not self._ascending
 
     def filter(self, l):
         return lazyset(self, l)