Show More
@@ -2974,10 +2974,10 class addset(abstractsmartset): | |||
|
2974 | 2974 | >>> [x for x in rs], [x for x in rs.fastasc()] # without _asclist |
|
2975 | 2975 | ([0, 2, 3, 4, 5], [0, 2, 3, 4, 5]) |
|
2976 | 2976 | >>> assert not rs._asclist |
|
2977 |
>>> len(rs) |
|
|
2978 |
|
|
|
2979 |
>>> [x for x in rs], [x for x in rs.fastasc()] |
|
|
2980 |
([0, 2, |
|
|
2977 | >>> len(rs) | |
|
2978 | 5 | |
|
2979 | >>> [x for x in rs], [x for x in rs.fastasc()] | |
|
2980 | ([0, 2, 3, 4, 5], [0, 2, 3, 4, 5]) | |
|
2981 | 2981 | >>> assert rs._asclist |
|
2982 | 2982 | |
|
2983 | 2983 | iterate descending: |
@@ -2985,23 +2985,23 class addset(abstractsmartset): | |||
|
2985 | 2985 | >>> [x for x in rs], [x for x in rs.fastdesc()] # without _asclist |
|
2986 | 2986 | ([5, 4, 3, 2, 0], [5, 4, 3, 2, 0]) |
|
2987 | 2987 | >>> assert not rs._asclist |
|
2988 |
>>> len(rs) |
|
|
2989 |
|
|
|
2990 |
>>> [x for x in rs], [x for x in rs.fastdesc()] |
|
|
2991 |
([5, 4, 3, 2, |
|
|
2988 | >>> len(rs) | |
|
2989 | 5 | |
|
2990 | >>> [x for x in rs], [x for x in rs.fastdesc()] | |
|
2991 | ([5, 4, 3, 2, 0], [5, 4, 3, 2, 0]) | |
|
2992 | 2992 | >>> assert rs._asclist |
|
2993 | 2993 | |
|
2994 | 2994 | iterate ascending without fastasc: |
|
2995 | 2995 | >>> rs = addset(xs, generatorset(ys), ascending=True) |
|
2996 | 2996 | >>> assert rs.fastasc is None |
|
2997 |
>>> [x for x in rs] |
|
|
2998 |
[0, 2, |
|
|
2997 | >>> [x for x in rs] | |
|
2998 | [0, 2, 3, 4, 5] | |
|
2999 | 2999 | |
|
3000 | 3000 | iterate descending without fastdesc: |
|
3001 | 3001 | >>> rs = addset(generatorset(xs), ys, ascending=False) |
|
3002 | 3002 | >>> assert rs.fastdesc is None |
|
3003 |
>>> [x for x in rs] |
|
|
3004 |
[5, 4, 3, 2, |
|
|
3003 | >>> [x for x in rs] | |
|
3004 | [5, 4, 3, 2, 0] | |
|
3005 | 3005 | """ |
|
3006 | 3006 | def __init__(self, revs1, revs2, ascending=None): |
|
3007 | 3007 | self._r1 = revs1 |
@@ -3020,10 +3020,10 class addset(abstractsmartset): | |||
|
3020 | 3020 | @util.propertycache |
|
3021 | 3021 | def _list(self): |
|
3022 | 3022 | if not self._genlist: |
|
3023 |
self._genlist = baseset(self |
|
|
3023 | self._genlist = baseset(iter(self)) | |
|
3024 | 3024 | return self._genlist |
|
3025 | 3025 | |
|
3026 |
def _ |
|
|
3026 | def __iter__(self): | |
|
3027 | 3027 | """Iterate over both collections without repeating elements |
|
3028 | 3028 | |
|
3029 | 3029 | If the ascending attribute is not set, iterate over the first one and |
@@ -3034,35 +3034,43 class addset(abstractsmartset): | |||
|
3034 | 3034 | same time, yielding only one value at a time in the given order. |
|
3035 | 3035 | """ |
|
3036 | 3036 | if self._ascending is None: |
|
3037 |
|
|
|
3037 | if self._genlist: | |
|
3038 | return iter(self._genlist) | |
|
3039 | def arbitraryordergen(): | |
|
3038 | 3040 | for r in self._r1: |
|
3039 | 3041 | yield r |
|
3040 | 3042 | inr1 = self._r1.__contains__ |
|
3041 | 3043 | for r in self._r2: |
|
3042 | 3044 | if not inr1(r): |
|
3043 | 3045 | yield r |
|
3044 |
|
|
|
3045 | else: | |
|
3046 | iter1 = iter(self._r1) | |
|
3047 | iter2 = iter(self._r2) | |
|
3048 | gen = self._iterordered(self._ascending, iter1, iter2) | |
|
3049 | return gen | |
|
3050 | ||
|
3051 | def __iter__(self): | |
|
3052 | if self._ascending is None: | |
|
3053 | if self._genlist: | |
|
3054 | return iter(self._genlist) | |
|
3055 | return iter(self._iterator()) | |
|
3046 | return arbitraryordergen() | |
|
3047 | # try to use our own fast iterator if it exists | |
|
3056 | 3048 | self._trysetasclist() |
|
3057 | 3049 | if self._ascending: |
|
3058 | 3050 | it = self.fastasc |
|
3059 | 3051 | else: |
|
3060 | 3052 | it = self.fastdesc |
|
3061 | if it is None: | |
|
3062 | # consume the gen and try again | |
|
3063 | self._list | |
|
3064 | return iter(self) | |
|
3053 | if it is not None: | |
|
3065 | 3054 | return it() |
|
3055 | # maybe half of the component supports fast | |
|
3056 | attr = 'fastdesc' | |
|
3057 | if self._ascending: | |
|
3058 | attr = 'fastasc' | |
|
3059 | # get iterator for _r1 | |
|
3060 | iter1 = getattr(self._r1, attr) | |
|
3061 | if iter1 is None: | |
|
3062 | # let's avoid side effect (not sure it matters) | |
|
3063 | iter1 = iter(sorted(self._r1, reverse=not self._ascending)) | |
|
3064 | else: | |
|
3065 | iter1 = iter1() | |
|
3066 | # get iterator for _r2 | |
|
3067 | iter2 = getattr(self._r2, attr) | |
|
3068 | if iter2 is None: | |
|
3069 | # let's avoid side effect (not sure it matters) | |
|
3070 | iter2 = iter(sorted(self._r2, reverse=not self._ascending)) | |
|
3071 | else: | |
|
3072 | iter2 = iter2() | |
|
3073 | return self._iterordered(self._ascending, iter1, iter2) | |
|
3066 | 3074 | |
|
3067 | 3075 | def _trysetasclist(self): |
|
3068 | 3076 | """populate the _asclist attribute if possible and necessary""" |
General Comments 0
You need to be logged in to leave comments.
Login now