A buffer of pending messages.
| 690 | |
| 691 | |
| 692 | class Messagebuffer(Evictable): |
| 693 | """A buffer of pending messages.""" |
| 694 | |
| 695 | Empty = Empty |
| 696 | |
| 697 | def __init__(self, maxsize, iterable=None, deque=deque): |
| 698 | # type: (int, Iterable, Any) -> None |
| 699 | self.maxsize = maxsize |
| 700 | self.data = deque(iterable or []) |
| 701 | self._append = self.data.append |
| 702 | self._pop = self.data.popleft |
| 703 | self._len = self.data.__len__ |
| 704 | self._extend = self.data.extend |
| 705 | |
| 706 | def put(self, item): |
| 707 | # type: (Any) -> None |
| 708 | self._append(item) |
| 709 | self.maxsize and self._evict() |
| 710 | |
| 711 | def extend(self, it): |
| 712 | # type: (Iterable) -> None |
| 713 | self._extend(it) |
| 714 | self.maxsize and self._evict() |
| 715 | |
| 716 | def take(self, *default): |
| 717 | # type: (*Any) -> Any |
| 718 | try: |
| 719 | return self._pop() |
| 720 | except IndexError: |
| 721 | if default: |
| 722 | return default[0] |
| 723 | raise self.Empty() |
| 724 | |
| 725 | def _pop_to_evict(self): |
| 726 | # type: () -> None |
| 727 | return self.take() |
| 728 | |
| 729 | def __repr__(self): |
| 730 | # type: () -> str |
| 731 | return f'<{type(self).__name__}: {len(self)}/{self.maxsize}>' |
| 732 | |
| 733 | def __iter__(self): |
| 734 | # type: () -> Iterable |
| 735 | while 1: |
| 736 | try: |
| 737 | yield self._pop() |
| 738 | except IndexError: |
| 739 | break |
| 740 | |
| 741 | def __len__(self): |
| 742 | # type: () -> int |
| 743 | return self._len() |
| 744 | |
| 745 | def __contains__(self, item) -> bool: |
| 746 | return item in self.data |
| 747 | |
| 748 | def __reversed__(self): |
| 749 | # type: () -> Iterable |
no outgoing calls