quarto_gen/quarto/server/match.py
2026-02-13 20:40:40 +01:00

35 lines
976 B
Python

from __future__ import annotations
import threading
from collections import deque
from typing import Deque, Optional, Tuple
from .net import ServerClient
class Matchmaker:
def __init__(self) -> None:
self._queue: Deque[ServerClient] = deque()
self._lock = threading.Lock()
def enqueue(self, client: ServerClient) -> None:
with self._lock:
# Avoid duplicates
if client in self._queue:
return
self._queue.append(client)
def dequeue_pair(self) -> Optional[Tuple[ServerClient, ServerClient]]:
with self._lock:
if len(self._queue) >= 2:
c1 = self._queue.popleft()
c2 = self._queue.popleft()
return c1, c2
return None
def remove(self, client: ServerClient) -> None:
with self._lock:
try:
self._queue.remove(client)
except ValueError:
pass