o
    "4g|
                     @  s>  U d Z ddlm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mZ ejZded< d	Zded
< edZ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G dd dee ZG dd dee Z		d/d0dd Z		d/d1d#d$Zdd%d2d+d,Zdd%d3d-d.ZdS )4z
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TypeVarr   Workerasyncio.Task[None]AWorkerT_GQueue_AGQueuec                   @  s   e Zd Zdd ZdS )FakeGenericMetac                 C  s   | S )N )selfitemr   r   Y/var/www/html/authentication-server/venv/lib/python3.10/site-packages/psycopg/_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   $       )	metaclassc                   @  r   )r   Nr   r   r   r   r   r   '   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 | Nonereturnr   c                   s   |d u rd}t  j||dS )Ng     @)r   r    )superget)r   r   r    	__class__r   r   r$   0   s   z	Queue.get)TN)r   r   r    r!   r"   r   )r   r   r   __doc__r$   __classcell__r   r   r%   r   r   +   s    r   c                   @  r   )AQueueNr   r   r   r   r   r)   7   r   r)   r   f(Callable[..., Coroutine[Any, Any, None]]argstuple[Any, ...]name
str | Noner"   c                 C  s   t j| | |dS )z,
    Equivalent to asyncio.create_task.
    )r.   )asynciocreate_task)r*   r,   r.   r   r   r   aspawn;   s   r2   Callable[..., Any]threading.Threadc                 C  s   t j| ||dd}|  |S )z=
    Equivalent to creating and running a daemon thread.
    T)targetr,   r.   daemon)	threadingThreadstart)r*   r,   r.   tr   r   r   spawnF   s   r;   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 dS w )7
    Equivalent to asyncio.gather or Thread.join()
    Nr<   )r0   gatherwait_forshieldTimeoutError)r    r=   waitr   r   r   agatherS   s   
rF   c                 G  s"   |D ]}|  s	q||  qdS )r@   N)is_alivejoin)r    r=   r:   r   r   r   rA   c   s
   rA   )r   N)r*   r+   r,   r-   r.   r/   r"   r   )r*   r3   r,   r-   r.   r/   r"   r4   )r=   r>   r    r!   r"   r?   )r=   r4   r    r!   r"   r?   )r'   
__future__r   queuer0   r7   typingr   r   r   r   _compatr   r	   r8   r
   __annotations__r   r   r   r   r   typer   r)   r2   r;   rF   rA   r   r   r   r   <module>   s4    
