Repository navigation
Expand file tree
/
Copy pathsave_queue.py
More file actions
53 lines (43 loc) · 1.41 KB
/
Copy pathsave_queue.py
File metadata and controls
53 lines (43 loc) · 1.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
from collections.abc import Callable
from dataclasses import dataclass
from typing import Any
@dataclass
class DeferredTask:
callback: Callable[[], Any]
after_id: str | None
class DeferredSaveQueue:
def __init__(self, root):
self.root = root
self._tasks: dict[str, DeferredTask] = {}
def pending(self, key: str) -> bool:
return key in self._tasks
def cancel(self, key: str) -> bool:
task = self._tasks.pop(key, None)
if task is None:
return False
if task.after_id:
try:
self.root.after_cancel(task.after_id)
except Exception:
pass
return True
def schedule(self, key: str, callback: Callable[[], Any], delay_ms: int = 250) -> None:
self.cancel(key)
after_id = self.root.after(delay_ms, lambda queue_key=key: self._run(queue_key))
self._tasks[key] = DeferredTask(callback=callback, after_id=after_id)
def _run(self, key: str) -> bool:
task = self._tasks.pop(key, None)
if task is None:
return False
task.callback()
return True
def flush(self, key: str) -> bool:
task = self._tasks.get(key)
if task is None:
return False
self.cancel(key)
task.callback()
return True
def flush_all(self) -> None:
for key in list(self._tasks):
self.flush(key)