o
    q¨Êh  ã                   @   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   ú?/var/www/html/env/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 |¤Ž |
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    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 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?   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    