U
    W¨+dš
  ã                   @   s>   d Z ddlmZ ddlmZ dgZG dd„ dƒZe e¡ dS )zSynchronization primitives.é   )ÚThenable)ÚpromiseÚbarrierc                   @   sX   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sL|rL| ¡ }|tk	rL|ˆ _d ˆ _ˆ _	d ˆ _
dˆ _dˆ _‡ fdd„|pzg D ƒ t|pŠˆ jƒˆ _|ržˆ  |¡ d S )N© é    Fc                    s   g | ]}ˆ   |¡‘qS r   )Ú
add_noincr)Ú.0Úp©Úselfr   ú8/tmp/pip-unpacked-wheel-hxs4m9cq/vine/synchronization.pyÚ
<listcomp>7   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   sF   | j sB| jsB|  jd7  _| jrB| j| jkrBd| _ | j| j| jŽ 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   s,   | j s"| j| jkr"| j| j| jŽ d| _ d S ©NT)r   r   r   r	   r   r   r
   r   r   r   ÚfinalizeC   s    zbarrier.finalizec                 C   s   d| _ | j ¡  d S r!   )r   r	   Úcancelr
   r   r   r   r#   H   s    zbarrier.cancelc                 C   s"   | j s| jrtdƒ‚| | ¡ d S )Nz"Cannot add promise to full barrier)r   r   Ú
ValueErrorr   ©r   r	   r   r   r   r   L   s    zbarrier.add_noincrc                 C   s"   | j s|  |¡ |  jd7  _d S )Nr   )r   r   r   r%   r   r   r   ÚaddR   s    
zbarrier.addc                 C   s   | j  ||¡ d S ©N)r	   r   )r   r   Zerrbackr   r   r   r   W   s    zbarrier.thenc                 O   s   | j s| jj||Ž d S r'   )r   r	   Úthrowr   r   r   r   r(   Z   s    zbarrier.throw)NNNNN)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r"   r#   r   r&   r   r(   Zthrow1r   r   r   r   r      s       ÿ

N)r,   Zabstractr   r   r   Ú__all__r   Úregisterr   r   r   r   Ú<module>   s
   X