o
    ^f%                     @  s  U d Z ddlmZ ddlZddlZddlZddlZddlZddlm	Z	m
Z
mZmZ ddlmZ ddlmZ edZed	ZejZejZejZejZejZejZd
ed< dZd
ed< erkejZd
ed< ejZ d
ed< nG dd de!Z"G dd deje"dZG dd deje"dZ d?ddZ#d?ddZ$G dd dee ZG dd dejZ%G dd  d ejZ&G d!d" d"e e Z'	#	d@dAd*d+Z(	#	d@dBd.d/Z)dd0dCd6d7Z*dd0dDd8d9Z+dEd=d>Z,dS )Fz
Utilities to ease the differences between async and sync code.

These object offer a similar interface between sync and async versions; the
script async_to_sync.py will replace the async names with the sync names
when generating the sync version.
    )annotationsN)AnyCallable	CoroutineTYPE_CHECKING)	TypeAlias   )TypeVarzpsycopg.poolTr   Workerasyncio.Task[None]AWorker_GQueue_AGQueuec                   @  s   e Zd Zdd ZdS )FakeGenericMetac                 C  s   | S N )selfitemr   r   N/home/ertert/spirit/venv/lib/python3.10/site-packages/psycopg_pool/_acompat.py__getitem__.   s   zFakeGenericMeta.__getitem__N)__name__
__module____qualname__r   r   r   r   r   r   -   s    r   c                   @     e Zd ZdS )r   Nr   r   r   r   r   r   r   r   1       )	metaclassc                   @  r   )r   Nr   r   r   r   r   r   4   r   returnstrc                   C  s
   t  jS r   )	threadingcurrent_threadnamer   r   r   r   current_thread_name8   s   
r#   c                  C  s   t  } | r
|  S dS )Nz	<no task>)asynciocurrent_taskget_name)tr   r   r   current_task_name<   s   r(   c                      s$   e Zd ZdZdd fd
dZ  ZS )Queuez>
    A Queue subclass with an interruptible get() method.
    TNblockbooltimeoutfloat | Noner   r
   c                   s   |d u rd}t  ||S )Ng     @)superget)r   r*   r,   	__class__r   r   r/   F   s   z	Queue.get)TN)r*   r+   r,   r-   r   r
   )r   r   r   __doc__r/   __classcell__r   r   r0   r   r)   A   s    r)   c                   @     e Zd ZdZd	ddZdS )
AEventz
    Subclass of asyncio.Event adding a wait with timeout like threading.Event.

    wait_timeout() is converted to wait() by async_to_sync.
    r,   floatr   r+   c                   6   zt |  |I d H  W dS  t jy   Y dS w NTFr$   wait_forwaitTimeoutErrorr   r,   r   r   r   wait_timeoutT      zAEvent.wait_timeoutNr,   r6   r   r+   r   r   r   r2   r>   r   r   r   r   r5   M       r5   c                   @  r4   )

AConditionz
    Subclass of asyncio.Condition adding a wait with timeout like threading.Condition.

    wait_timeout() is converted to wait() by async_to_sync.
    r,   r6   r   r+   c                   r7   r8   r9   r=   r   r   r   r>   c   r?   zACondition.wait_timeoutNr@   rA   r   r   r   r   rC   \   rB   rC   c                   @  r   )AQueueNr   r   r   r   r   rD   k   r   rD   r   f(Callable[..., Coroutine[Any, Any, None]]argstuple[Any, ...]r"   
str | Nonec                 C  s   t j| | |dS )z,
    Equivalent to asyncio.create_task.
    )r"   )r$   create_task)rE   rG   r"   r   r   r   aspawno   s   rK   Callable[..., Any]threading.Threadc                 C  s   t j| ||dd}|  |S )z=
    Equivalent to creating and running a daemon thread.
    T)targetrG   r"   daemon)r    Threadstart)rE   rG   r"   r'   r   r   r   spawnz   s   rR   r,   tasksasyncio.Task[Any]r,   r-   Nonec                   s   t j| }z| durt jt || dI dH  W dS |I dH  W dS  t jy,   Y nw |D ]}| r6q/td| |  q/dS )7
    Equivalent to asyncio.gather or Thread.join()
    NrS   z'couldn't stop task %r within %s seconds)	r$   gatherr:   shieldr<   doneloggerwarningr&   )r,   rT   r;   r'   r   r   r   agather   s    
r]   c                 G  s<   |D ]}|  s	q||  |  sqtd|j|  qdS )rW   z)couldn't stop thread %r within %s secondsN)is_alivejoinr[   r\   r"   )r,   rT   r'   r   r   r   rX      s   
rX   secondsr6   Coroutine[Any, Any, None]c                 C  s
   t | S )zT
    Equivalent to asyncio.sleep(), converted to time.sleep() by async_to_sync.
    )r$   sleep)r`   r   r   r   asleep   s   
rc   )r   r   )r   N)rE   rF   rG   rH   r"   rI   r   r   )rE   rL   rG   rH   r"   rI   r   rM   )rT   rU   r,   r-   r   rV   )rT   rM   r,   r-   r   rV   )r`   r6   r   ra   )-r2   
__future__r   timequeuer$   loggingr    typingr   r   r   r   typing_extensionsr   _compatr	   	getLoggerr[   r
   Event	ConditionRLockLockALockrb   rP   r   __annotations__r   r)   r   r   typer   r#   r(   r5   rC   rD   rK   rR   r]   rX   rc   r   r   r   r   <module>   sP    



