o
    svXjÚ
  ã                   @   sP   d Z ddlmZmZ ddlmZ ddlmZ dgZG dd„ de	ƒZ
e e
¡ dS )	zSynchronization primitives.é    )Úabsolute_importÚunicode_literalsé   )ÚThenable)ÚpromiseÚbarrierc                   @   s\   e Zd ZdZ		ddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	ddd„Z
dd„ ZeZdS )r   a…  Barrier.

    Synchronization primitive to call a callback after a list
    of promises have been fulfilled.

    Example:

    .. code-block:: python

        # Request supports the .then() method.
        p1 = http.Request('http://a')
        p2 = http.Request('http://b')
        p3 = http.Request('http://c')
        requests = [p1, p2, p3]

        def all_done():
            pass  # all requests complete

        b = barrier(requests).then(all_done)

        # oops, we forgot we want another request
        b.add(http.Request('http://d'))

    Note that you cannot add new promises to a barrier after
    the barrier is fulfilled.
    Nc                    s¦   t ƒ ˆ _|pdˆ _|pi ˆ _dˆ _|pdˆ _ˆ js&|r&| ¡ }|tur&|ˆ _d ˆ _ˆ _	d ˆ _
dˆ _dˆ _‡ fdd„|p=g D ƒ t|pEˆ jƒˆ _|rQˆ  |¡ d S d S )N© r   Fc                    s   g | ]}ˆ   |¡‘qS r   )Ú
add_noincr)Ú.0Úp©Úselfr   úQ/var/www/html/myproject/venv/lib/python3.10/site-packages/vine/synchronization.pyÚ
<listcomp>9   s    z$barrier.__init__.<locals>.<listcomp>)r   r   ÚargsÚkwargsÚ_valueÚsizeÚ__len__ÚNotImplementedÚreadyÚfailedÚreasonÚ	cancelledÚ	finalizedÚboolÚthen)r   Úpromisesr   r   Úcallbackr   Úplenr   r   r   Ú__init__&   s$   



ÿzbarrier.__init__c                 O   sZ   | j s%| js'|  jd7  _| jr)| j| jkr+d| _ | j| ji | j¤Ž d S d S d S d S d S )Nr   T)r   r   r   r   r   r   r   r   ©r   r   r   r   r   r   Ú__call__>   s   üzbarrier.__call__c                 C   s0   | j s| j| jkr| j| ji | j¤Ž d| _ d S ©NT)r   r   r   r   r   r   r   r   r   r   ÚfinalizeE   s   
zbarrier.finalizec                 C   s   d| _ | j ¡  d S r#   )r   r   Úcancelr   r   r   r   r%   J   s   zbarrier.cancelc                 C   s&   | j s| jr
tdƒ‚| | ¡ d S d S )Nz"Cannot add promise to full barrier)r   r   Ú
ValueErrorr   ©r   r   r   r   r   r	   N   s
   ýzbarrier.add_noincrc                 C   s&   | j s|  |¡ |  jd7  _d S d S )Nr   )r   r	   r   r'   r   r   r   ÚaddT   s   
þzbarrier.addc                 C   s   | j  ||¡ d S ©N)r   r   )r   r   Úerrbackr   r   r   r   Y   s   zbarrier.thenc                 O   s    | j s| jj|i |¤Ž d S d S r)   )r   r   Úthrowr!   r   r   r   r+   \   s   ÿzbarrier.throw)NNNNNr)   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r    r"   r$   r%   r	   r(   r   r+   Úthrow1r   r   r   r   r   
   s    
ÿ
N)r/   Ú
__future__r   r   Úabstractr   r   r   Ú__all__Úobjectr   Úregisterr   r   r   r   Ú<module>   s    V