U
    h                  
   @  sT  d dl mZ d dlZd dlZd dlmZ d dlmZ d dlmZ d dlmZ dZdZ	zd dl
Z
W n* ek
r Z zeeZ	W 5 dZ[X Y nZX dZd	d
lmZ d	dlmZ d	dlmZ d	dlmZ d	dlmZ d	dlmZ d	dlmZ edZG dd dZejsPesPdd Zdd Zdd Zdd Zdd Zdd Zd d! Zd"d# Zd$d% ZdS )&    )annotationsN)Any)Callable)	Coroutine)TypeVarFT   )
await_only)await_fallback)in_greenlet)greenlet_spawn)is_exit_exception)AsyncAdaptedLock)_Runner_Tc                   @  sT   e Zd ZdZddddZddddd	d
dZddddd	ddZddddZdS )
_AsyncUtilz&Asyncio util for test suite/ util onlyNone)returnc                 C  s   t rt | _d S N)have_greenletr   runnerself r   ?/tmp/pip-unpacked-wheel-y9ln43lq/sqlalchemy/util/concurrency.py__init__)   s    z_AsyncUtil.__init__z&Callable[..., Coroutine[Any, Any, _T]]r   r   )fnargskwargsr   c                 O  s   | j |||S )zRun coroutine on the loop)r   runr   r   r   r   r   r   r   r   -   s    z_AsyncUtil.runzCallable[..., _T]c                 O  sD   t r6| j  r|||S | jt|f||S n
|||S dS )z3Run sync function in greenlet. Support nested callsN)r   r   Zget_loopZ
is_runningr   r   r   r   r   r   run_in_greenlet6   s
    
z_AsyncUtil.run_in_greenletc                 C  s   t r| j  d S r   )r   r   closer   r   r   r   r!   B   s    z_AsyncUtil.closeN)__name__
__module____qualname____doc__r   r   r    r!   r   r   r   r   r   &   s
   	r   c                   C  s    t rd S ttrdt ndd S )Nz9the greenlet library is required to use this function. %s )r   
ValueErrorgreenlet_errorr   r   r   r   _not_implementedI   s    r)   c                 C  s   t | t S r   )
isinstance	Exception)er   r   r   r   V   s    r   c                 C  s
   t   d S r   r)   thingr   r   r   r   Y   s    r   c                 C  s   | S r   r   r.   r   r   r   r	   \   s    r	   c                   C  s
   t   d S r   r-   r   r   r   r   r
   _   s    r
   c                 O  s
   t   d S r   r-   )r   r   kwr   r   r   r   b   s    r   c                  O  s
   t   d S r   r-   )r   r0   r   r   r   r   e   s    r   c                 O  s
   | ||S r   r   r   argr0   r   r   r   _util_async_runh   s    r3   c                 O  s
   t   d S r   r-   r1   r   r   r   "_util_async_run_coroutine_functionk   s    r4   )
__future__r   Zasynciotypingr   r   r   r   r   r(   ZgreenletImportErrorr,   strZ_concurrency_py3kr   r	   r
   r   r   r   r   r   r   TYPE_CHECKINGr)   r3   r4   r   r   r   r   <module>	   sB   !