o
    svXjÞ  ã                   @   s¬   d Z ddlmZmZ ddlZddlmZ ddlZddlm	Z	 zddlm
Z
 W n ey5   ddlm
Z
 Y nw ddlmZ dd	lmZmZ d
gZejeG dd
„ d
eƒƒƒZdS )zPromise implementation.é    )Úabsolute_importÚunicode_literalsN)Údeque)Úref)Ú
WeakMethodé   )ÚThenable)Úpython_2_unicode_compatibleÚ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

        >>> from __future__ import print_statement  # noqa
        >>> 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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   úJ/var/www/html/myproject/venv/lib/python3.10/site-packages/vine/promises.pyÚ__init__]   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   x   s
   
zpromise._get_fun_or_weakrefc                 C   s*   | j rdnd d t| ƒjt| ƒ¡| j ¡S )Nz<{0} --> {1!r}>z<{0}>z{0}@0x{1: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 |¤Ž |
s„W 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"   r0   ¾   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   r2   r   r   r   r   r   r   Úappend)r    r!   r   r   r   r9   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 s‡t ¡ 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@   rB   r   r   r3   r   r
   r'   )r    rA   ÚtbÚ	propagateÚcurrent_excr9   r:   r   r   r"   r2   Ý   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<   r0   r   rB   r2   ÚpropertyrF   r   r   r   r"   r      s&    
>
þ
&


)rI   Ú
__future__r   r   r?   Úcollectionsr   r$   Úweakrefr   r   ÚImportErrorÚ vine.backports.weakref_backportsÚabstractr   Úfiver	   r
   Ú__all__ÚregisterÚobjectr   r   r   r   r"   Ú<module>   s"    ÿ