U
    bh                     @   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}d S )N     Fc                    s   g | ]}  |qS r   )
add_noincr).0pselfr   8/tmp/pip-unpacked-wheel-wrrz14qk/vine/synchronization.py
<listcomp>7   s     z$barrier.__init__.<locals>.<listcomp>)r	   argskwargs_valuesizereadyreason	cancelled	finalized__weakref____dict__)r   r	   r   r   r   r   __len__NotImplementedr   failedr   r   r   boolthen)r   promisesr   r   callbackr   plen	__slots__r   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__D   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   finalizeK   s    zbarrier.finalizec                 C   s   d| _ | j  d S r$   )r   r	   cancelr
   r   r   r   r&   P   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   T   s    zbarrier.add_noincrc                 C   s"   | j s| | |  jd7  _d S )Nr   )r   r   r   r(   r   r   r   addZ   s    
zbarrier.addc                 C   s   | j || d S N)r	   r   )r   r   Zerrbackr   r   r   r   _   s    zbarrier.thenc                 O   s   | j s| jj|| d S r*   )r   r	   throwr"   r   r   r   r+   b   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
   `