o
    Df                     @   sf   d Z ddlZddlZddlmZ ddlmZmZ ddlm	Z	 ddl
mZ dgZe	jG d	d dZdS )
zPromise implementation.    N)deque)
WeakMethodref   )Thenable)reraisepromisec                   @   s   e Zd ZdZeedsdZ			dddZe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dZedd ZdS )r   a~  Promise of future evaluation.

    This is a special implementation of promises in that it can
    be used both for "promise of a value" and lazy evaluation.
    The biggest upside for this is that everything in a promise can also be
    a promise, e.g. filters, callbacks and errbacks can all be promises.

    Usage examples:

    .. code-block:: python

        >>> p = promise()
        >>> p.then(promise(print, ('OK',)))  # noqa
        >>> p.on_error = promise(print, ('ERROR',))  # noqa
        >>> p(20)
        OK, 20
        >>> p.then(promise(print, ('hello',)))  # noqa
        hello, 20


        >>> p.throw(KeyError('foo'))
        ERROR, KeyError('foo')


        >>> p2 = promise()
        >>> p2.then(print)  # noqa
        >>> p2.cancel()
        >>> p(30)

    Example:
    .. code-block:: python

        from vine import promise, wrap

        class Protocol:

            def __init__(self):
                self.buffer = []

            def receive_message(self):
                return self.read_header().then(
                    self.read_body).then(
                        wrap(self.prepare_body))

            def read(self, size, callback=None):
                callback = callback or promise()
                tell_eventloop_to_read(size, callback)
                return callback

            def read_header(self, callback=None):
                return self.read(4, callback)

            def read_body(self, header, callback=None):
                body_size, = unpack('>L', header)
                return self.read(body_size, callback)

            def prepare_body(self, value):
                self.buffer.append(value)
    pypy_version_info)funargskwargsreadyfailedvalueignore_resultreason
_svpending
_lvpendingon_error	cancelledweak__weakref____dict__NFc                 C   s   || _ || _| j||d| _|pd| _|pi | _d| _d| _d | _d | _	d | _
d | _|| _d| _|d ur9| | | jrE| jrCt|sGJ d S d S )Nr
   r    F)r   r   _get_fun_or_weakrefr
   r   r   r   r   r   r   r   r   r   r   thencallable)selfr
   r   r   callbackr   r   r   r   r   F/home/ubuntu/webapp/venv/lib/python3.10/site-packages/vine/promises.py__init__T   s&   


zpromise.__init__c                 C   s"   |s| S t | rt| S t| S )zbReturn the callable or a weak reference.

        Handles both bound and unbound methods.
        )inspectismethodr   r   r   r   r   r    r   o   s
   
zpromise._get_fun_or_weakrefc                 C   s.   | j rdndt| j dt| d| j S )Nz<{0} --> {1!r}>z<{0}>z@0xx)r
   formattype__name__idr   r   r   r    __repr__}   s   zpromise.__repr__c              	   C   s   d| _ z<| jd ur| j  | jd ur| jD ]}|  qt| jtr4| j  W d  | _ | _| _d S W d  | _ | _| _d S d  | _ | _| _w )NT)r   r   cancelr   
isinstancer   r   )r   pendingr   r   r    r+      s   




*zpromise.cancelc                 O   sB  d }| j rd S |r| j| n| j}|rt| jfi |n| j}| | j}|d urYz"| jr9||i | d}i }n||i |}|fi f | _\}}W n tyX   | 	  Y S w ||f | _\}}d| _
| j}	|	d ur~z|	|i | W d | _|S d | _w | j}
z|
r|
 }||i | |
sW d | _|S W d | _|S d | _w )Nr   T)r   r   dictr   _fun_is_aliver
   r   r   	Exceptionthrowr   r   r   popleft)r   r   r   retval
final_argsfinal_kwargsr
   cack	svpending	lvpendingpr   r   r    __call__   sN   	zpromise.__call__c                 C   s   | j r| S | jS N)r   r
   )r   r
   r   r   r    r/      s   zpromise._fun_is_alivec                 C   s   t |tst||d}| jr|  |S | jr|| j n| jr-| j	\}}||i | | j
d u rI| j}|d urDd t|g| _| _
n|| _|S | j
| |S )N)r   )r,   r   r   r   r+   r   r1   r   r   r   r   r   r   append)r   r   r   r   r   r8   r   r   r    r      s$   


zpromise.thenc                 C   sX   | j s(|d ur	|nt d }d|| _| _| jr*| j| j|f i | j d S d S d S )Nr   T)r   sysexc_infor   r   r   r   r   )r   excr   r   r    throw1   s   zpromise.throw1Tc              
   C   s  | j st d }|d ur|n|}zV| | | j}|d ur-z
|| W d | _nd | _w | j}z|r<| | |s3W d | _nd | _w W | jd u rd|rf|d u rZ|d u sY||u rZ tt	||| d S d S d S | jd u r|r|d u r||d u s{||u r| tt	||| w w w d S )Nr   )
r   r>   r?   rA   r   r   r2   r   r   r&   )r   r@   tb	propagatecurrent_excr8   r9   r   r   r    r1      s8   
zpromise.throwc                 C   s   | j r| j S | jgS r<   )r   r   r)   r   r   r    	listeners   s   zpromise.listeners)NNNNNFFr<   )NNT)r'   
__module____qualname____doc__hasattrr>   	__slots__r!   staticmethodr   r*   r+   r;   r/   r   rA   r1   propertyrE   r   r   r   r    r      s&    
<

&


)rH   r"   r>   collectionsr   weakrefr   r   abstractr   utilsr   __all__registerr   r   r   r   r    <module>   s    