U
    (–€h!6  ã                   @  sð  U d dl mZ dg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 dlm
Z
 d dlZd dlZd d	lmZmZ d
dlmZ d
dlm	Z d dlmZ d dlmZmZ d dlmZmZmZmZ d dlZejdkrìd dlmZm Z m!Z! nd dlmZm Z m!Z! edƒZ"eddd�Z#edddd�Z$edddd�Z%eddd�Z&eddd�Z'edƒZ"eddd�Z(dZ)de*d< ejd k�rŒe eee(f Z+de*d!< nBejdk�rÂeee)de(f e eee(f f Z+de*d!< nd"Z+de*d!< G d#d$„ d$ƒZ,G d%d„ de,ƒZ-dS )&é    )ÚannotationsÚ	TaskGroupN)ÚTracebackType)Úevents)Ú
exceptions)Útasks)Úfutures)ÚOptionalÚTypeé   )Úinstall)ÚBaseExceptionGroup)ÚAnyÚUnion)ÚSelfÚ	TypeAliasÚLiteralÚTypeVar)é   é	   )Ú	GeneratorÚ	CoroutineÚ	AwaitableÚ_TÚ
_YieldT_coT)Ú	covariantÚ_SendT_contra)ÚcontravariantÚdefaultÚ_ReturnT_co)r   r   Ú_SendT_contra_nd)r   Ú_ReturnT_co_ndÚ_T_cozfutures.Future[object] | Noner   Ú_TaskYieldType)r   é   Ú_TaskCompatibleCoroz9Generator[_TaskYieldType, None, _T_co] | Awaitable[_T_co]c                   @  sª   e Zd ZdZddœdd„Zddœdd„Zd	dœd
d„Zdddddœdd„Zddddœdd„Zdddœdddddœdd„Z	dd d!œd"d#„Z
ddœd$d%„Zd&dd'œd(d)„ZdS )*Ú
_TaskGroupa9  Asynchronous context manager for managing groups of tasks.

    Example use:

        async with asyncio.TaskGroup() as group:
            task1 = group.create_task(some_coroutine(...))
            task2 = group.create_task(other_coroutine(...))
        print("Both tasks have completed now.")

    All tasks are awaited when the context manager exits.

    Any exceptions other than `asyncio.CancelledError` raised within
    a task will cancel all remaining tasks and wait for them to exit.
    The exceptions are then combined and raised as an `ExceptionGroup`.
    ÚNone©Úreturnc                 C  sB   d| _ d| _d| _d | _d | _d| _tƒ | _g | _d | _	d | _
d S )NF)Ú_enteredÚ_exitingÚ	_abortingÚ_loopÚ_parent_taskÚ_parent_cancel_requestedÚsetÚ_tasksÚ_errorsÚ_base_errorÚ_on_completed_fut©Úself© r7   ú8/tmp/pip-unpacked-wheel-rrqp3fat/taskgroup/taskgroups.pyÚ__init__J   s    z_TaskGroup.__init__Ústrc                 C  sv   dg}| j r"| dt| j ƒ› �¡ | jr>| dt| jƒ› �¡ | jrP| d¡ n| jr`| d¡ d |¡}d|› d�S )	NÚ ztasks=zerrors=Z
cancellingZenteredú z
<TaskGroupú>)r1   ÚappendÚlenr2   r,   r*   Újoin)r6   ÚinfoZinfo_strr7   r7   r8   Ú__repr__V   s    

z_TaskGroup.__repr__r   c                 Ã  s\   | j rtd| ›d�ƒ‚| jd kr*t ¡ | _t | j¡| _| jd krRtd| ›d�ƒ‚d| _ | S )Nú
TaskGroup z has already been enteredz! cannot determine the parent taskT)r*   ÚRuntimeErrorr-   r   Zget_running_loopr   Zcurrent_taskr.   r5   r7   r7   r8   Ú
__aenter__d   s    


z_TaskGroup.__aenter__úOptional[Type[BaseException]]úOptional[BaseException]úOptional[TracebackType]úOptional[bool])ÚetÚexcÚtbr)   c                 Ã  s8   d }z|  ||¡I d H W ¢S d | _ d | _d | _d }X d S ©N)r.   r2   r3   Ú_aexit)r6   rJ   rK   rL   r7   r7   r8   Ú	__aexit__p   s    z_TaskGroup.__aexit__)rJ   rK   r)   c              
   Ã  s¨  | j d k	st‚| jd k	st‚| jd k	s*t‚d| _|d k	rR|  |¡rR| jd krR|| _|tjkr`|nd }| j	r|| j  
¡ dkr|d }|d k	r’| js’|  ¡  | jrþ| jd kr®| j ¡ | _z| jI d H  W n6 tjk
rô } z| jsä|}|  ¡  W 5 d }~X Y nX d | _q’| j�r
t‚| jd k	�r(z
| j‚W 5 d }X z"|�rH| j�sHz|‚W 5 d }X W 5 d }X |d k	�r‚|tjk	�r‚|d k	�svt‚| j |¡ | j�r¤ztd| jƒd ‚W 5 d }X d S )NTr   zunhandled errors in a TaskGroup)r.   ÚAssertionErrorr-   r2   r+   Ú_is_base_errorr3   r   ZCancelledErrorr/   Zuncancelr,   Ú_abortr1   r4   Zcreate_futurer>   r   )r6   rJ   rK   Zpropagate_cancellation_errorÚexr7   r7   r8   rN   ƒ   s\    
	

þýz_TaskGroup._aexitN©ÚnameÚcontextú_TaskCompatibleCoro[_T_co]ú
str | Noneúcontextvars.Context | Noneztasks.Task[_T_co]©ÚcororU   rV   r)   c                C  s¸   | j std| ›d�ƒ‚| jr2| js2td| ›d�ƒ‚| jrHtd| ›d�ƒ‚| jdk	sVt‚|dkrl| j |¡}n| jj||d�}t 	||¡ | 
¡ rœ|  |¡ n| j |¡ | | j¡ |S ©zbCreate a new task in this group and return it.

        Similar to `asyncio.create_task`.
        rC   z has not been enteredz is finishedz is shutting downN)rV   )r*   rD   r+   r1   r,   r-   rP   Úcreate_taskr   Ú_set_task_nameÚdoneÚ_on_task_doneÚaddÚadd_done_callback©r6   r[   rU   rV   Útaskr7   r7   r8   r]   á   s     z_TaskGroup.create_taskÚBaseExceptionÚbool)rK   r)   c                 C  s   t |tƒst‚t |ttfƒS rM   )Ú
isinstancere   rP   Ú
SystemExitÚKeyboardInterrupt)r6   rK   r7   r7   r8   rQ     s    z_TaskGroup._is_base_errorc                 C  s&   d| _ | jD ]}| ¡ s| ¡  qd S )NT)r,   r1   r_   Úcancel)r6   Útr7   r7   r8   rR   
  s    
z_TaskGroup._abortztasks.Task[object])rd   r)   c                 C  sü   | j d k	st‚| jd k	st‚| jd k	s*t‚| j |¡ | jd k	r\| js\| j ¡ s\| j d¡ | 	¡ rhd S | 
¡ }|d kr|d S | j  |¡ |  |¡r¢| jd kr¢|| _| j ¡ rÔ| j d|›d| j› d�||dœ¡ d S | jsø| jsø|  ¡  d| _| j ¡  d S )NTzTask z% has errored out but its parent task z is already completed)ÚmessageÚ	exceptionrd   )r2   rP   r.   r-   r1   Údiscardr4   r_   Ú
set_resultZ	cancelledrm   r>   rQ   r3   Zcall_exception_handlerr,   r/   rR   rj   )r6   rd   rK   r7   r7   r8   r`     s6    

üÿz_TaskGroup._on_task_done)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r9   rB   rE   rO   rN   r]   rQ   rR   r`   r7   r7   r7   r8   r&   9   s   bû%r&   c                      s\   e Zd ZU ded< dddœddddd	œd
d„Zddœ‡ fdd„Zdddddœdd„Z‡  ZS )r   zcontextlib.AsyncExitStackÚ_TaskGroup__stackNrT   rW   rX   rY   z_tasks.Task[_T_co]rZ   c                C  s¼   | j std| ›d�ƒ‚| jr2| js2td| ›d�ƒ‚| jrHtd| ›d�ƒ‚| jdk	sVt‚|dkrnt | j|¡}ntj| j||d�}t 	||¡ | 
¡ r |  |¡ n| j |¡ | | j¡ |S r\   )r*   rD   r+   r1   r,   r-   rP   Ztask_factoryr   r^   r_   r`   ra   rb   rc   r7   r7   r8   r]   N  s     zTaskGroup.create_taskr   r(   c              
   ƒ  sb   t  ¡ 4 I d H šB}| t ¡ ¡I d H  tƒ  ¡ I d H  | tƒ j¡ | 	¡ | _
W 5 Q I d H R X | S rM   )Ú
contextlibÚAsyncExitStackÚenter_async_contextÚ_installZinstall_uncancelÚsuperrE   Úpush_async_exitrO   Úpop_allrt   )r6   Ústack©Ú	__class__r7   r8   rE   o  s    zTaskGroup.__aenter__rF   rG   rH   rI   )Úexc_typeÚexc_valÚexc_tbr)   c                 Ã  s   | j  |||¡I d H S rM   )rt   rO   )r6   r   r€   r�   r7   r7   r8   rO   w  s    zTaskGroup.__aexit__)rp   rq   rr   Ú__annotations__r]   rE   rO   Ú__classcell__r7   r7   r}   r8   r   K  s   
û!).Ú
__future__r   Ú__all__ÚsysÚtypesr   Zasyncior   r   r   r   ZcontextvarsÚtypingr	   r
   r;   r   rx   r1   Zexceptiongroupr   r   r   Ztyping_extensionsr   r   r   r   ru   Úversion_infoÚcollections.abcr   r   r   r   r   r   r   r    r!   r"   r#   r‚   r%   r&   r   r7   r7   r7   r8   Ú<module>   sV    
ÿÿÿ
  