Source code for chipiron.games.game.progress_collector

"""
Module collecting the progress of computing moves by each player
"""

import queue
from dataclasses import dataclass, field
from typing import Protocol

import chess

from chipiron.utils.communication.gui_messages import PlayerProgressMessage
from chipiron.utils.dataclass import IsDataclass


[docs]class PlayerProgressCollectorP(Protocol): """ Object defining the protocol for setting the progress values """
[docs] def progress_white(self, value: int | None) -> None: ...
[docs] def progress_black(self, value: int | None) -> None: ...
[docs]@dataclass class PlayerProgressCollector: """ Object in charge of collecting the progress of computing moves by each player """ progress_white_: int | None = None progress_black_: int | None = None @property def progress_white(self) -> int | None: return self.progress_white_ @progress_white.setter def progress_white(self, value: int | None) -> None: self.progress_white_ = value @property def progress_black(self) -> int | None: return self.progress_black_ @progress_black.setter def progress_black(self, value: int | None) -> None: self.progress_black_ = value
[docs]@dataclass class PlayerProgressCollectorObservable: """ Object in charge of collecting the progress of computing moves by each player """ progress_collector: PlayerProgressCollector = field( default_factory=PlayerProgressCollector ) subscribers: list[queue.Queue[IsDataclass]] = field(default_factory=list)
[docs] def progress_white(self, value: int | None) -> None: self.progress_collector.progress_white = value self.notify(color=chess.WHITE, value=value)
[docs] def progress_black(self, value: int | None) -> None: self.progress_collector.progress_black = value self.notify(color=chess.BLACK, value=value)
[docs] def notify(self, color: chess.Color, value: int | None) -> None: for subscriber in self.subscribers: subscriber.put( PlayerProgressMessage(player_color=color, progress_percent=value) )