o
     JAf@Y                  
   @   s  d Z ddlZddlZddlZddlZddlZdZdZdZdZ	dZ
dZd	Zd
ZdZe
eeeegZe
dedededediZedZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd deZG dd  d eZG d!d" d"eZd#d$ Zd%d& Zd5d'd(Z e!d)d*Z"defd+d,Z#d5d-d.Z$G d/d0 d0eZ%G d1d2 d2eZ&G d3d4 d4e'Z(dS )6z"Brian Quinlan (brian@sweetapp.com)    NFIRST_COMPLETEDFIRST_EXCEPTIONALL_COMPLETED_AS_COMPLETEDPENDINGRUNNING	CANCELLEDCANCELLED_AND_NOTIFIEDFINISHEDpendingrunning	cancelledfinishedzconcurrent.futuresc                   @      e Zd Z	 dS )ErrorN__name__
__module____qualname__ r   r   //usr/lib/python3.10/concurrent/futures/_base.pyr   -       r   c                   @   r   )CancelledErrorNr   r   r   r   r   r   1   r   r   c                   @   r   )TimeoutErrorNr   r   r   r   r   r   5   r   r   c                   @   r   )InvalidStateErrorNr   r   r   r   r   r   9   r   r   c                   @   s.   e Zd Z	 dd Zdd Zdd Zdd Zd	S )
_Waiterc                 C   s   t  | _g | _d S N)	threadingEventeventfinished_futuresselfr   r   r   __init__?   s   

z_Waiter.__init__c                 C      | j | d S r   r    appendr"   futurer   r   r   
add_resultC      z_Waiter.add_resultc                 C   r$   r   r%   r'   r   r   r   add_exceptionF   r*   z_Waiter.add_exceptionc                 C   r$   r   r%   r'   r   r   r   add_cancelledI   r*   z_Waiter.add_cancelledN)r   r   r   r#   r)   r+   r,   r   r   r   r   r   =   s    r   c                       sB   e Zd Z	  fddZ fddZ fddZ fddZ  ZS )	_AsCompletedWaiterc                    s   t t|   t | _d S r   )superr-   r#   r   Locklockr!   	__class__r   r   r#   O   s   z_AsCompletedWaiter.__init__c                    F   | j  tt| | | j  W d    d S 1 sw   Y  d S r   )r0   r.   r-   r)   r   setr'   r1   r   r   r)   S      "z_AsCompletedWaiter.add_resultc                    r3   r   )r0   r.   r-   r+   r   r4   r'   r1   r   r   r+   X   r5   z _AsCompletedWaiter.add_exceptionc                    r3   r   )r0   r.   r-   r,   r   r4   r'   r1   r   r   r,   ]   r5   z _AsCompletedWaiter.add_cancelled)r   r   r   r#   r)   r+   r,   __classcell__r   r   r1   r   r-   L   s    r-   c                       s6   e Zd Z	  fddZ fddZ fddZ  ZS )_FirstCompletedWaiterc                       t  | | j  d S r   )r.   r)   r   r4   r'   r1   r   r   r)   e      z _FirstCompletedWaiter.add_resultc                    r8   r   )r.   r+   r   r4   r'   r1   r   r   r+   i   r9   z#_FirstCompletedWaiter.add_exceptionc                    r8   r   )r.   r,   r   r4   r'   r1   r   r   r,   m   r9   z#_FirstCompletedWaiter.add_cancelled)r   r   r   r)   r+   r,   r6   r   r   r1   r   r7   b   s
    r7   c                       sJ   e Zd Z	  fddZdd Z fddZ fddZ fd	d
Z  ZS )_AllCompletedWaiterc                    s$   || _ || _t | _t   d S r   )num_pending_callsstop_on_exceptionr   r/   r0   r.   r#   )r"   r;   r<   r1   r   r   r#   t   s   
z_AllCompletedWaiter.__init__c                 C   sZ   | j   |  jd8  _| js| j  W d    d S W d    d S 1 s&w   Y  d S )N   )r0   r;   r   r4   r!   r   r   r   _decrement_pending_callsz   s   "z,_AllCompletedWaiter._decrement_pending_callsc                       t  | |   d S r   )r.   r)   r>   r'   r1   r   r   r)         z_AllCompletedWaiter.add_resultc                    s,   t  | | jr| j  d S |   d S r   )r.   r+   r<   r   r4   r>   r'   r1   r   r   r+      s   z!_AllCompletedWaiter.add_exceptionc                    r?   r   )r.   r,   r>   r'   r1   r   r   r,      r@   z!_AllCompletedWaiter.add_cancelled)	r   r   r   r#   r>   r)   r+   r,   r6   r   r   r1   r   r:   q   s    r:   c                   @   s&   e Zd Z	 dd Zdd Zdd ZdS )_AcquireFuturesc                 C   s   t |td| _d S )N)key)sortedidfutures)r"   rE   r   r   r   r#      s   z_AcquireFutures.__init__c                 C   s   | j D ]}|j  qd S r   )rE   
_conditionacquirer'   r   r   r   	__enter__      
z_AcquireFutures.__enter__c                 G   s   | j D ]}|j  qd S r   )rE   rF   release)r"   argsr(   r   r   r   __exit__   rI   z_AcquireFutures.__exit__N)r   r   r   r#   rH   rL   r   r   r   r   rA      s
    rA   c                 C   s   |t krt }n-|tkrt }n%tdd | D }|tkr$t|dd}n|tkr/t|dd}ntd| | D ]}|j	
| q7|S )Nc                 s   s    | ]
}|j ttfvV  qd S r   _stater	   r
   .0fr   r   r   	<genexpr>   s    
z._create_and_install_waiters.<locals>.<genexpr>T)r<   FzInvalid return condition: %r)r   r-   r   r7   sumr   r:   r   
ValueError_waitersr&   )fsreturn_whenwaiterpending_countrQ   r   r   r   _create_and_install_waiters   s   rZ   c                 c   sn    	 | r5| d }|D ]}| | q
|j |j | W d    n1 s&w   Y  ~|  V  | sd S d S )N)removerF   rU   pop)rV   rX   ref_collectrQ   futures_setr   r   r   _yield_finished_futures   s   

r`   c           	      c   s   	 |d ur|t   }t| } t| }t|  tdd | D }| | }t| t}W d    n1 s5w   Y  t|}zt||| fdE d H  |r|d u rSd }n|t   }|dk rgt	dt||f |j
| |j |j}g |_|j
  W d    n1 sw   Y  |  t||| |fdE d H  |sLW | D ]}|j |j| W d    n1 sw   Y  qd S | D ]}|j |j| W d    n1 sw   Y  qw )Nc                 s   s"    | ]}|j ttfv r|V  qd S r   rM   rO   r   r   r   rR      s    zas_completed.<locals>.<genexpr>)r^   r   z%d (of %d) futures unfinished)time	monotonicr4   lenrA   rZ   r   listr`   r   r   waitr0   r    clearreverserF   rU   r\   )	rV   timeoutend_timetotal_futuresr   r   rX   wait_timeoutrQ   r   r   r   as_completed   sf   
rl   DoneAndNotDoneFutureszdone not_donec              	   C   s6  	 t | } t| Y dd | D }| | }|tkr'|r't||W  d    S |tkrB|rBtdd |D rBt||W  d    S t|t| krVt||W  d    S t| |}W d    n1 sew   Y  |j	| | D ]}|j
 |j| W d    n1 sw   Y  qr||j t|| | S )Nc                 S   s   h | ]}|j ttfv r|qS r   rM   rO   r   r   r   	<setcomp>$  s    zwait.<locals>.<setcomp>c                 s   s(    | ]}|  s| d ur|V  qd S r   )r   	exceptionrO   r   r   r   rR   *  s    zwait.<locals>.<genexpr>)r4   rA   r   rm   r   anyrc   rZ   r   re   rF   rU   r\   updater    )rV   rh   rW   donenot_donerX   rQ   r   r   r   re   	  s2   
re   c                 C   s*   zz|  |W |   W ~ S |   w ~ w r   )resultcancel)futrh   r   r   r   _result_or_cancel<  s   


rw   c                   @   s   e Z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d ZdddZdddZdd Zdd Zdd ZeejZdS )Futurec                 C   s.   	 t  | _t| _d | _d | _g | _g | _d S r   )	r   	ConditionrF   r   rN   _result
_exceptionrU   _done_callbacksr!   r   r   r   r#   J  s   

zFuture.__init__c              	   C   s:   | j D ]}z||  W q ty   td|  Y qw d S Nz!exception calling callback for %r)r|   	ExceptionLOGGERro   )r"   callbackr   r   r   _invoke_callbacksS  s   
zFuture._invoke_callbacksc                 C   s   | j P | jtkr>| jr%d| jjt| t| j | jjjf W  d    S d| jjt| t| j | jjjf W  d    S d| jjt| t| j f W  d    S 1 sVw   Y  d S )Nz<%s at %#x state=%s raised %s>z <%s at %#x state=%s returned %s>z<%s at %#x state=%s>)	rF   rN   r
   r{   r2   r   rD   _STATE_TO_DESCRIPTION_MAPrz   r!   r   r   r   __repr__Z  s.   
	$zFuture.__repr__c                 C   s   	 | j 0 | jttfv r	 W d    dS | jttfv r%	 W d    dS t| _| j   W d    n1 s7w   Y  |   dS )NFT)rF   rN   r   r
   r   r	   
notify_allr   r!   r   r   r   ru   n  s   
zFuture.cancelc                 C   s:   	 | j  | jttfv W  d    S 1 sw   Y  d S r   )rF   rN   r   r	   r!   r   r   r   r     s   $zFuture.cancelledc                 C   s6   	 | j  | jtkW  d    S 1 sw   Y  d S r   )rF   rN   r   r!   r   r   r   r     s   $zFuture.runningc                 C   s<   	 | j  | jtttfv W  d    S 1 sw   Y  d S r   )rF   rN   r   r	   r
   r!   r   r   r   rr     s   $zFuture.donec                 C   s   | j r
z| j d } w | jS r   )r{   rz   r!   r   r   r   __get_result  s
   zFuture.__get_resultc                 C   s   	 | j  | jtttfvr| j| 	 W d    d S W d    n1 s&w   Y  z||  W d S  tyB   t	d|  Y d S w r}   )
rF   rN   r   r	   r
   r|   r&   r~   r   ro   )r"   fnr   r   r   add_done_callback  s   
zFuture.add_done_callbackNc                 C   s   	 zT| j D | jttfv rt | jtkr#|  W  d    W d } S | j | | jttfv r3t | jtkrF|  W  d    W d } S t 1 sLw   Y  W d } d S d } w r   )	rF   rN   r   r	   r   r
   _Future__get_resultre   r   r"   rh   r   r   r   rt     s&   

zFuture.resultc                 C   s   	 | j < | jttfv rt | jtkr| jW  d    S | j | | jttfv r.t | jtkr=| jW  d    S t 1 sCw   Y  d S r   )	rF   rN   r   r	   r   r
   r{   re   r   r   r   r   r   ro     s   

zFuture.exceptionc                 C   s   	 | j < | jtkr!t| _| jD ]}||  q	 W d    dS | jtkr2t| _	 W d    dS t	dt
| | j td1 sCw   Y  d S )NFTz!Future %s in unexpected state: %szFuture in unexpected state)rF   rN   r   r	   rU   r,   r   r   r   criticalrD   RuntimeError)r"   rX   r   r   r   set_running_or_notify_cancel  s$   


z#Future.set_running_or_notify_cancelc                 C      	 | j / | jttthv rtd| j| || _t| _| jD ]}|	|  q| j 
  W d    n1 s6w   Y  |   d S Nz{}: {!r})rF   rN   r   r	   r
   r   formatrz   rU   r)   r   r   )r"   rt   rX   r   r   r   
set_result     
zFuture.set_resultc                 C   r   r   )rF   rN   r   r	   r
   r   r   r{   rU   r+   r   r   )r"   ro   rX   r   r   r   set_exception*  r   zFuture.set_exceptionr   )r   r   r   r#   r   r   ru   r   r   rr   r   r   rt   ro   r   r   r   classmethodtypesGenericAlias__class_getitem__r   r   r   r   rx   G  s"    	


#"(rx   c                   @   sF   e Zd Z	 dd ZdddddZdd	d
ddZdd Zdd ZdS )Executorc                O   s   	 t  r   )NotImplementedError)r"   r   rK   kwargsr   r   r   submit>  s   zExecutor.submitNr=   )rh   	chunksizec                   sD   	 d urt    fddt| D  fdd}| S )Nc                    s   g | ]}j  g|R  qS r   )r   )rP   rK   )r   r"   r   r   
<listcomp>b  s    z Executor.map.<locals>.<listcomp>c               	   3   sp    z,   r"d u rt V  nt  t  V  sW D ]} |   q%d S D ]} |   q0w r   )rg   rw   r]   ra   rb   ru   )r(   )ri   rV   rh   r   r   result_iteratorf  s   

z%Executor.map.<locals>.result_iterator)ra   rb   zip)r"   r   rh   r   	iterablesr   r   )ri   r   rV   r"   rh   r   mapI  s   zExecutor.mapTF)cancel_futuresc                C   s   	 d S r   r   )r"   re   r   r   r   r   shutdownu  s   zExecutor.shutdownc                 C   s   | S r   r   r!   r   r   r   rH     s   zExecutor.__enter__c                 C   s   | j dd dS )NT)re   F)r   )r"   exc_typeexc_valexc_tbr   r   r   rL     s   zExecutor.__exit__)T)r   r   r   r   r   r   rH   rL   r   r   r   r   r   ;  s    ,r   c                   @   s   e Zd ZdS )BrokenExecutorNr   r   r   r   r   r     s    r   r   ))
__author__collectionsloggingr   ra   r   r   r   r   r   r   r   r   r	   r
   _FUTURE_STATESr   	getLoggerr   r~   r   r   r   r   objectr   r-   r7   r:   rA   rZ   r`   rl   
namedtuplerm   re   rw   rx   r   r   r   r   r   r   r   <module>   sb   	
	
>
3 uR