LastNoob's picture
Make messaging trees atomic ownership boundaries (#1048)
083f30c unverified
Raw
History Blame Contribute Delete
1.33 kB
"""FIFO queue state for one messaging conversation tree."""
from collections import deque
class MessageNodeQueue:
"""Queue with snapshot/remove helpers, backed by a deque and a set index."""
def __init__(self, items: list[str] | None = None) -> None:
self._deque: deque[str] = deque()
self._set: set[str] = set()
for item in items or []:
self.put(item)
def put(self, item: str) -> bool:
"""Append a unique item and report whether the queue changed."""
if item in self._set:
return False
self._deque.append(item)
self._set.add(item)
return True
def pop(self) -> str | None:
if not self._deque:
return None
item = self._deque.popleft()
self._set.discard(item)
return item
def qsize(self) -> int:
return len(self._deque)
def items(self) -> tuple[str, ...]:
return tuple(self._deque)
def remove(self, item: str) -> bool:
if item not in self._set:
return False
self._set.discard(item)
self._deque = deque(x for x in self._deque if x != item)
return True
def drain(self) -> tuple[str, ...]:
items = tuple(self._deque)
self._deque.clear()
self._set.clear()
return items