| 470 | |
| 471 | |
| 472 | class GroupQueue(object): |
| 473 | |
| 474 | def __init__(self, *groups): |
| 475 | self.queue = [] |
| 476 | for group in groups: |
| 477 | self.enq(group) |
| 478 | |
| 479 | def enq(self, group): |
| 480 | depth = group.depth |
| 481 | while depth > len(self.queue) - 1: |
| 482 | self.queue.append([]) |
| 483 | self.queue[depth].append(group) |
| 484 | |
| 485 | def deq(self): |
| 486 | for stack in self.queue: |
| 487 | for idx, group in enumerate(reversed(stack)): |
| 488 | if group.breakables: |
| 489 | del stack[idx] |
| 490 | group.want_break = True |
| 491 | return group |
| 492 | for group in stack: |
| 493 | group.want_break = True |
| 494 | del stack[:] |
| 495 | |
| 496 | def remove(self, group): |
| 497 | try: |
| 498 | self.queue[group.depth].remove(group) |
| 499 | except ValueError: |
| 500 | pass |
| 501 | |
| 502 | |
| 503 | def _default_pprint(obj, p, cycle): |