Show More
@@ -2638,52 +2638,20 b' class _addset(_orderedsetmixin):' | |||
|
2638 | 2638 | same time, yielding only one value at a time in the given order. |
|
2639 | 2639 | """ |
|
2640 | 2640 | if not self._iter: |
|
2641 | def gen(): | |
|
2642 |
|
|
|
2641 | if self._ascending is None: | |
|
2642 | def gen(): | |
|
2643 | 2643 | for r in self._r1: |
|
2644 | 2644 | yield r |
|
2645 | 2645 | s = self._r1.set() |
|
2646 | 2646 | for r in self._r2: |
|
2647 | 2647 | if r not in s: |
|
2648 | 2648 | yield r |
|
2649 |
|
|
|
2650 | iter1 = iter(self._r1) | |
|
2651 |
|
|
|
2652 | ||
|
2653 | val1 = None | |
|
2654 | val2 = None | |
|
2655 | ||
|
2656 | choice = max | |
|
2657 | if self._ascending: | |
|
2658 | choice = min | |
|
2659 | try: | |
|
2660 | # Consume both iterators in an ordered way until one is | |
|
2661 | # empty | |
|
2662 | while True: | |
|
2663 | if val1 is None: | |
|
2664 | val1 = iter1.next() | |
|
2665 | if val2 is None: | |
|
2666 | val2 = iter2.next() | |
|
2667 | next = choice(val1, val2) | |
|
2668 | yield next | |
|
2669 | if val1 == next: | |
|
2670 | val1 = None | |
|
2671 | if val2 == next: | |
|
2672 | val2 = None | |
|
2673 | except StopIteration: | |
|
2674 | # Flush any remaining values and consume the other one | |
|
2675 | it = iter2 | |
|
2676 | if val1 is not None: | |
|
2677 | yield val1 | |
|
2678 | it = iter1 | |
|
2679 | elif val2 is not None: | |
|
2680 | # might have been equality and both are empty | |
|
2681 | yield val2 | |
|
2682 | for val in it: | |
|
2683 | yield val | |
|
2684 | ||
|
2685 | self._iter = _generatorset(gen()) | |
|
2686 | ||
|
2649 | gen = gen() | |
|
2650 | else: | |
|
2651 | iter1 = iter(self._r1) | |
|
2652 | iter2 = iter(self._r2) | |
|
2653 | gen = self._iterordered(self._ascending, iter1, iter2) | |
|
2654 | self._iter = _generatorset(gen) | |
|
2687 | 2655 | return self._iter |
|
2688 | 2656 | |
|
2689 | 2657 | def __iter__(self): |
@@ -2691,6 +2659,47 b' class _addset(_orderedsetmixin):' | |||
|
2691 | 2659 | return iter(self._genlist) |
|
2692 | 2660 | return iter(self._iterator()) |
|
2693 | 2661 | |
|
2662 | def _iterordered(self, ascending, iter1, iter2): | |
|
2663 | """produce an ordered iteration from two iterators with the same order | |
|
2664 | ||
|
2665 | The ascending is used to indicated the iteration direction. | |
|
2666 | """ | |
|
2667 | choice = max | |
|
2668 | if ascending: | |
|
2669 | choice = min | |
|
2670 | ||
|
2671 | val1 = None | |
|
2672 | val2 = None | |
|
2673 | ||
|
2674 | choice = max | |
|
2675 | if self._ascending: | |
|
2676 | choice = min | |
|
2677 | try: | |
|
2678 | # Consume both iterators in an ordered way until one is | |
|
2679 | # empty | |
|
2680 | while True: | |
|
2681 | if val1 is None: | |
|
2682 | val1 = iter1.next() | |
|
2683 | if val2 is None: | |
|
2684 | val2 = iter2.next() | |
|
2685 | next = choice(val1, val2) | |
|
2686 | yield next | |
|
2687 | if val1 == next: | |
|
2688 | val1 = None | |
|
2689 | if val2 == next: | |
|
2690 | val2 = None | |
|
2691 | except StopIteration: | |
|
2692 | # Flush any remaining values and consume the other one | |
|
2693 | it = iter2 | |
|
2694 | if val1 is not None: | |
|
2695 | yield val1 | |
|
2696 | it = iter1 | |
|
2697 | elif val2 is not None: | |
|
2698 | # might have been equality and both are empty | |
|
2699 | yield val2 | |
|
2700 | for val in it: | |
|
2701 | yield val | |
|
2702 | ||
|
2694 | 2703 | def __contains__(self, x): |
|
2695 | 2704 | return x in self._r1 or x in self._r2 |
|
2696 | 2705 |
General Comments 0
You need to be logged in to leave comments.
Login now