diff options
author | cyfraeviolae <cyfraeviolae> | 2024-04-03 03:17:55 -0400 |
---|---|---|
committer | cyfraeviolae <cyfraeviolae> | 2024-04-03 03:17:55 -0400 |
commit | 12cf076118570eebbff08c6b3090e0d4798447a1 (patch) | |
tree | 3ba25e17e3c3a5e82316558ba3864b955919ff72 /venv/lib/python3.11/site-packages/litestar/utils/sync.py | |
parent | c45662ff3923b34614ddcc8feb9195541166dcc5 (diff) |
no venv
Diffstat (limited to 'venv/lib/python3.11/site-packages/litestar/utils/sync.py')
-rw-r--r-- | venv/lib/python3.11/site-packages/litestar/utils/sync.py | 79 |
1 files changed, 0 insertions, 79 deletions
diff --git a/venv/lib/python3.11/site-packages/litestar/utils/sync.py b/venv/lib/python3.11/site-packages/litestar/utils/sync.py deleted file mode 100644 index 02acabf..0000000 --- a/venv/lib/python3.11/site-packages/litestar/utils/sync.py +++ /dev/null @@ -1,79 +0,0 @@ -from __future__ import annotations - -from typing import ( - AsyncGenerator, - Awaitable, - Callable, - Generic, - Iterable, - Iterator, - TypeVar, -) - -from typing_extensions import ParamSpec - -from litestar.concurrency import sync_to_thread -from litestar.utils.predicates import is_async_callable - -__all__ = ("ensure_async_callable", "AsyncIteratorWrapper", "AsyncCallable", "is_async_callable") - - -P = ParamSpec("P") -T = TypeVar("T") - - -def ensure_async_callable(fn: Callable[P, T]) -> Callable[P, Awaitable[T]]: - """Ensure that ``fn`` is an asynchronous callable. - If it is an asynchronous, return the original object, else wrap it in an - ``AsyncCallable`` - """ - if is_async_callable(fn): - return fn - return AsyncCallable(fn) # pyright: ignore - - -class AsyncCallable: - """Wrap a given callable to be called in a thread pool using - ``anyio.to_thread.run_sync``, keeping a reference to the original callable as - :attr:`func` - """ - - def __init__(self, fn: Callable[P, T]) -> None: # pyright: ignore - self.func = fn - - def __call__(self, *args: P.args, **kwargs: P.kwargs) -> Awaitable[T]: # pyright: ignore - return sync_to_thread(self.func, *args, **kwargs) # pyright: ignore - - -class AsyncIteratorWrapper(Generic[T]): - """Asynchronous generator, wrapping an iterable or iterator.""" - - __slots__ = ("iterator", "generator") - - def __init__(self, iterator: Iterator[T] | Iterable[T]) -> None: - """Take a sync iterator or iterable and yields values from it asynchronously. - - Args: - iterator: A sync iterator or iterable. - """ - self.iterator = iterator if isinstance(iterator, Iterator) else iter(iterator) - self.generator = self._async_generator() - - def _call_next(self) -> T: - try: - return next(self.iterator) - except StopIteration as e: - raise ValueError from e - - async def _async_generator(self) -> AsyncGenerator[T, None]: - while True: - try: - yield await sync_to_thread(self._call_next) - except ValueError: - return - - def __aiter__(self) -> AsyncIteratorWrapper[T]: - return self - - async def __anext__(self) -> T: - return await self.generator.__anext__() |