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

37 lines
1007 B
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from functools import singledispatch, wraps
import asyncio
import inspect
import types
from typing import Any, Callable, Generator
@singledispatch
def sync(co: Any):
raise TypeError('Called with unsupported argument: {}'.format(co))
@sync.register(asyncio.Future)
@sync.register(types.GeneratorType)
def sync_co(co: Generator[Any, None, Any]) -> Any:
if not inspect.isawaitable(co):
raise TypeError('Called with unsupported argument: {}'.format(co))
return asyncio.get_event_loop().run_until_complete(co)
@sync.register(types.FunctionType)
@sync.register(types.MethodType)
def sync_fu(f: Callable[..., Any]) -> Callable[..., Any]:
if not asyncio.iscoroutinefunction(f):
raise TypeError('Called with unsupported argument: {}'.format(f))
@wraps(f)
def run(*args, **kwargs):
return asyncio.get_event_loop().run_until_complete(f(*args, **kwargs))
return run
sync.register(types.CoroutineType)(sync_co)