from typing import Callable class Timer: def __init__(self, name: str, initial: float, seconds: float, count: int, callback: Callable[[], None] = None): self._name = name self._enabled = False self._initial = initial self._seconds = seconds self._rest = 0 self._count = count self._current = 0 self._callback = callback def restart(self): self._enabled = True self._current = 0 self._rest = self._initial def tick(self, dt: float): if not self._enabled or self._seconds == 0 or self._current >= self._count: return self._rest -= dt if self._rest <= 0: self._current += 1 self._rest += self._seconds if self._callback: self._callback() def cancel(self): self._enabled = False def current(self): return self._current def count(self): return self._count def rest(self): return self._count - self._current def complete(self): return self._current >= self._count def running(self): return self._enabled and not self.complete()