a
    xd                     @   sf   d Z ddlZddlmZ ddl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)ref
WeakMethod   )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(object):

            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__NFc                 C   s   || _ || _| j||d| _|p"d| _|p,i | _d| _d| _d | _d | _	d | _
d | _|| _d| _|d urr| | | jr| jrt|sJ 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   E/var/www/html/Ranjet/env/lib/python3.9/site-packages/vine/promises.py__init__S   s"    


zpromise.__init__c                 C   s&   |s| S t | rt| S t| S dS )zbReturn the callable or a weak reference.

        Handles both bound and unbound methods.
        N)inspectismethodr   r   r   r   r   r   r   n   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rP| j  W d  | _ | _| _nd  | _ | _| _0 d S )NT)r   r   cancelr   
isinstancer   r   )r   pendingr   r   r   r*      s    




zpromise.cancelc                 O   s>  d }| j rd S |r| j| n| j}|r8t| jfi |n| j}| | j}|d urzD| jrr||i | d}i }n"||i |}|fi f | _\}}W q ty   | 	  Y S 0 n||f | _\}}d| _
| j}	|	d ur z|	|i | W d | _nd | _0 n:| j}
z*|
r(|
 }||i | qW d | _nd | _0 |S )Nr   T)r   r   dictr   _fun_is_aliver
   r   r   	Exceptionthrowr   r   r   popleft)r   r   r   retvalZ
final_argsZfinal_kwargsr
   caZck	svpending	lvpendingpr   r   r   __call__   s<    
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rZ| j	\}}||i | | j
d u r| j}|d urd t|g | _| _
n
|| _|S | j
| |S )N)r   )r+   r   r   r   r*   r   r0   r   r   r   r   r   r   append)r   r   r   r   r   r4   r   r   r   r      s$    


zpromise.thenc                 C   sP   | j sL|d ur|n
t d }d| | _| _| jrL| j| j|f i | j d S )Nr   T)r   sysexc_infor   r   r   r   r   )r   excr   r   r   throw1   s
    zpromise.throw1Tc              
   C   s
  | j st d }|d ur |n|}z| | | j}|d ur^z|| W d | _qd | _0 n.| j}z|rz| | qfW d | _nd | _0 W | jd u r|r|d u r|d u s||u r tt	||| n>| jd u r|r|d u r|d u s||u r tt	||| 0 d S )Nr   )
r   r:   r;   r=   r   r   r1   r   r   r%   )r   r<   tb	propagateZcurrent_excr4   r5   r   r   r   r0      s.    
zpromise.throwc                 C   s   | j r| j S | jgS r8   )r   r   r(   r   r   r   	listeners   s    zpromise.listeners)NNNNNFF)N)N)NNT)r&   
__module____qualname____doc__hasattrr:   	__slots__r    staticmethodr   r)   r*   r7   r.   r   r=   r0   propertyr@   r   r   r   r   r      s$   <
   

&


)rC   r:   collectionsr   r!   weakrefr   r   Zabstractr   utilsr   __all__registerr   r   r   r   r   <module>   s   