ai-station/.venv/lib/python3.12/site-packages/textual/await_remove.py

48 lines
1.3 KiB
Python
Raw Normal View History

2025-12-25 14:54:33 +00:00
"""
An *optionally* awaitable object returned by methods that remove widgets.
"""
from __future__ import annotations
import asyncio
from asyncio import Task, gather
from typing import Generator
import rich.repr
from textual._callback import invoke
from textual._debug import get_caller_file_and_line
from textual._types import CallbackType
@rich.repr.auto
class AwaitRemove:
"""An awaitable that waits for nodes to be removed."""
def __init__(
self, tasks: list[Task], post_remove: CallbackType | None = None
) -> None:
self._tasks = tasks
self._post_remove = post_remove
self._caller = get_caller_file_and_line()
def __rich_repr__(self) -> rich.repr.Result:
yield "tasks", self._tasks
yield "post_remove", self._post_remove
yield "caller", self._caller, None
async def __call__(self) -> None:
await self
def __await__(self) -> Generator[None, None, None]:
current_task = asyncio.current_task()
tasks = [task for task in self._tasks if task is not current_task]
async def await_prune() -> None:
"""Wait for the prune operation to finish."""
await gather(*tasks)
if self._post_remove is not None:
await invoke(self._post_remove)
return await_prune().__await__()