paul@33 | 1 | #!/usr/bin/env python |
paul@33 | 2 | |
paul@33 | 3 | def itermerge(seq1, seq2): |
paul@33 | 4 | |
paul@33 | 5 | "Merge 'seq1' and 'seq2' to produce an ordered, combined list of results." |
paul@33 | 6 | |
paul@33 | 7 | results = [] |
paul@33 | 8 | |
paul@33 | 9 | iter1 = iter(seq1) |
paul@33 | 10 | iter2 = iter(seq2) |
paul@33 | 11 | |
paul@33 | 12 | t1 = None |
paul@33 | 13 | t2 = None |
paul@33 | 14 | |
paul@33 | 15 | t1 = _itermerge_next(iter1) |
paul@33 | 16 | if t1 is None: |
paul@33 | 17 | _itermerge_fill(iter2, results) |
paul@33 | 18 | return results |
paul@33 | 19 | |
paul@33 | 20 | while 1: |
paul@33 | 21 | if t1 is None: |
paul@33 | 22 | t1 = _itermerge_next(iter1) |
paul@33 | 23 | if t1 is None: |
paul@33 | 24 | results.append(t2) |
paul@33 | 25 | _itermerge_fill(iter2, results) |
paul@33 | 26 | return results |
paul@33 | 27 | else: |
paul@33 | 28 | t2 = _itermerge_next(iter2) |
paul@33 | 29 | if t2 is None: |
paul@33 | 30 | results.append(t1) |
paul@33 | 31 | _itermerge_fill(iter1, results) |
paul@33 | 32 | return results |
paul@33 | 33 | |
paul@33 | 34 | if t1 < t2: |
paul@33 | 35 | results.append(t1) |
paul@33 | 36 | t1 = None |
paul@33 | 37 | else: |
paul@33 | 38 | results.append(t2) |
paul@33 | 39 | t2 = None |
paul@33 | 40 | |
paul@33 | 41 | def _itermerge_next(iter): |
paul@33 | 42 | try: |
paul@33 | 43 | return iter.next() |
paul@33 | 44 | except StopIteration: |
paul@33 | 45 | return None |
paul@33 | 46 | |
paul@33 | 47 | def _itermerge_fill(iter, results): |
paul@33 | 48 | try: |
paul@33 | 49 | while 1: |
paul@33 | 50 | results.append(iter.next()) |
paul@33 | 51 | except StopIteration: |
paul@33 | 52 | pass |
paul@33 | 53 | |
paul@33 | 54 | # vim: tabstop=4 expandtab shiftwidth=4 |