o
    `Z>                     @   sN  d dl Z d dlmZ d dlmZ d dlZd dlmZmZmZm	Z	 d dl
ZG dd dZdd Zd	d
 Zdd Zedd Zd&ddZdd ZG dd dZe Zz
d dl mZmZ W n* ey   d dlZeddZG dd dejZe Zdd ZeefddZY nw G dd dZe ej!drej!j"e d d! Z#d"d# Z$d$d% Z%dS )'    N)wraps)	coroutine)getcoroutinestateCORO_CREATEDCORO_CLOSEDCORO_SUSPENDEDc                   @      e Zd Zdd ZdS )YieldWrapperc                 C   s
   || _ d S Npayload)selfr    r   9usr/lib/python3.10/site-packages/async_generator/_impl.py__init__      
zYieldWrapper.__init__N__name__
__module____qualname__r   r   r   r   r   r	          r	   c                 C   s   t | S r
   )r	   valuer   r   r   _wrap   s   r   c                 C   s
   t | tS r
   )
isinstancer	   Zboxr   r   r   _is_wrapped   r   r   c                 C   s   | j S r
   r   r   r   r   r   _unwrap   s   r   c                 c   s    t | V S r
   )r   r   r   r   r   _yield_a   s   
r   c                    s   t | I d H S r
   )r   r   r   r   r   yield_i   s   r   c           	         s  dd }t | | }t|dr|I d H }zt ||I d H }W n ty9 } z||}W Y d }~|S d }~ww 	 z	t|I d H }W nn tyh } zz|j}W n
 ty[   Y |w | I d H  |d }~w t	y } z?t
 }z|j}W n	 ty   |w z	|| I d H }W n ty } z||}W Y d }~W Y d }~|S d }~ww W Y d }~n6d }~ww z|d u rt ||I d H }n||I d H }W n ty } z||}W Y d }~|S d }~ww q;)Nc                 S   s   | j r| j d S d S )Nr   )args)er   r   r   unpack_StopAsyncIterationy   s   
z.yield_from_.<locals>.unpack_StopAsyncIteration	__await__)type	__aiter__hasattr	__anext__StopAsyncIterationr   GeneratorExitacloseAttributeErrorBaseExceptionsysexc_infoathrowasend)	Zdelegater"   Z_iZ_y_eZ_rZ_s_mZ_xr   r   r   yield_from_m   sn   

"



r3   c                   @   s>   e Zd Zdd Zdd Zdd Zdd Zdd
dZdd Zd	S )	ANextIterc                 G   s   || _ || _|| _d S r
   )_it	_first_fn_first_args)r   itfirst_fn
first_argsr   r   r   r      s   
zANextIter.__init__c                 C      | S r
   r   r   r   r   r   r#         zANextIter.__await__c                 C   sB   | j d ur| j }| j}d  | _ | _| j|g|R  S | | jjS r
   )r6   r7   _invoker5   __next__)r   r9   r:   r   r   r   r?      s   
zANextIter.__next__c                 C      |  | jj|S r
   )r>   r5   sendr   r   r   r   r   rA         zANextIter.sendNc                 C      |  | jj|||S r
   )r>   r5   throwr   r$   r   	tracebackr   r   r   rE         zANextIter.throwc              
   G   sh   z|| }W n! t y } zt|jd }~w ty' } ztd|d }~ww t|r2t t||S )Nz(async_generator raise StopAsyncIteration)StopIterationr(   r   RuntimeErrorr   r   )r   fnr    resultr!   r   r   r   r>      s    
zANextIter._invokeNN)	r   r   r   r   r#   r?   rA   rE   r>   r   r   r   r   r4      s    	
r4   )get_asyncgen_hooksset_asyncgen_hooksasyncgen_hooks	firstiter	finalizerc                   @   r   )_hooks_storagec                 C   s   d | _ d | _d S r
   rQ   r<   r   r   r   r      s   
z_hooks_storage.__init__Nr   r   r   r   r   rT      r   rT   c                   C   s   t tjtjdS )NrQ   )rP   _hooksrR   rS   r   r   r   r   rN      s   rN   c                 C   sn   | t ur| d u st| r| t_n
tdt| j|t ur5|d u s&t|r+|t_d S tdt|jd S )Nz#callable firstiter expected, got {}z#callable finalizer expected, got {})	UNSPECIFIEDcallablerU   rR   	TypeErrorformatr$   r   rS   rQ   r   r   r   rO      s"   
rO   c                   @   s   e Zd Ze Zdd Zejdk rdd Zndd Ze	dd Z
e	d	d
 Zdd Zdd ZdddZdd Zdd Zdd ZdS )AsyncGeneratorc                 C   s,   || _ | | _d| _d | _d| _d| _d S )NF)
_coroutiner#   r5   
ag_running
_finalizer_closed_hooks_inited)r   r   r   r   r   r   #  s   

zAsyncGenerator.__init__)         c                    s   | S r
   r   r<   r   r   r   r%   4  s   zAsyncGenerator.__aiter__c                 C   r;   r
   r   r<   r   r   r   r%   8  r=   c                 C      | j jS r
   )r[   cr_coder<   r   r   r   ag_code?     zAsyncGenerator.ag_codec                 C   rc   r
   )r[   cr_framer<   r   r   r   ag_frameC  rf   zAsyncGenerator.ag_framec                 C   s   |  | jjS r
   )_do_itr5   r?   r<   r   r   r   r'   P  s   zAsyncGenerator.__anext__c                 C   r@   r
   )ri   r5   rA   rB   r   r   r   r0   S  rC   zAsyncGenerator.asendNc                 C   rD   r
   )ri   r5   rE   rF   r   r   r   r/   V  rH   zAsyncGenerator.athrowc                    sl   j s!d_ t \}_|d ur| tjjdkr!jj t	jt
u r+t  fdd}| S )NTpypyc                      sd   j rtdz%zd_ tjg R  I d H W W d_ S  ty-   jj  w d_ w )Nz!async generator already executingTF)r\   
ValueErrorr4   r5   r(   _pypy_issue2786_workarounddiscardr[   r   r    r   start_fnr   r   stepi  s   z#AsyncGenerator._do_it.<locals>.step)r_   rN   r]   r-   implementationnamerl   addr[   r   r   r(   )r   ro   r    rR   rp   r   rn   r   ri   Y  s   zAsyncGenerator._do_itc              	      s|   t | j}|tu s| jrd S d| _|tu r| j  d S z| tI d H  W td tt	fy=   | j
| j Y d S w )NT%async_generator ignored GeneratorExit)r   r[   r   r^   r   r5   closer/   r)   r(   rl   rm   rJ   )r   stater   r   r   r*   {  s   

zAsyncGenerator.aclosec              	   C   s   | j | j t| jtu r| j  t| jtu ra| jsc| jd ur)| |  d S | 	t
}z-z|d  W n t
tfyA   Y n tyK   tdw td| jjW |  d S |  w d S d S )Nrt   zasync_generator {!r} awaited during finalization; install a finalization hook to support this, or wrap it in 'async with aclosing(...):')rl   rm   r[   r   r   ru   r   r^   r]   r/   r)   rA   r(   rI   rJ   rY   re   co_name)r   Zthrowerr   r   r   __del__  s2   



zAsyncGenerator.__del__rM   )r   r   r   setrl   r   r-   version_infor%   propertyre   rh   r'   r0   r/   ri   r*   rx   r   r   r   r   rZ     s     




"rZ   c                    s"   t   fdd}t||_|S )Nc                     s   t  | i |S r
   )rZ   )r    kwargscoroutine_makerr   r   async_generator_maker  s   z.async_generator.<locals>.async_generator_maker)r   id_async_gen_function)r~   r   r   r}   r   async_generator  s   
r   c                 C   s"   t tdrt| rdS t| tS )N
isasyncgenT)r&   inspectr   r   rZ   objr   r   r   r     s   


r   c                 C   s,   t tdrt| rdS t| ddt| kS )NisasyncgenfunctionTr   )r&   r   r   getattrr   r   r   r   r   r     s   

r   r
   )&r-   	functoolsr   typesr   r   r   r   r   r   collections.abccollectionsr	   r   r   r   r   r   r3   r4   objectrV   rN   rO   ImportError	threading
namedtuplerP   localrT   rU   rZ   r&   abcregisterr   r   r   r   r   r   r   <module>   sF    I

J-) 	