
    Pf                         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                      ZdS )
zPromise implementation.    N)deque)
WeakMethodref   )Thenable)reraisepromisec                       e Zd ZdZ eed          sdZ	 	 	 ddZed             Z	d Z
d	 Zd
 Zd ZddZddZddZe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                 ^   || _         || _        |                     ||          | _        |pd| _        |pi | _        d| _        d| _        d | _        d | _	        d | _
        d | _        || _        d| _        ||                     |           | j        r| j        rt          |          sJ 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   s           ?/var/www/html/env/lib/python3.11/site-packages/vine/promises.py__init__zpromise.__init__T   s     	*++$+??JB	l


  IIh8 	.8----	. 	.--    c                 n    |s| S t          j        |           rt          |           S t          |           S )zbReturn the callable or a weak reference.

        Handles both bound and unbound methods.
        )inspectismethodr   r   r   s     r#   r   zpromise._get_fun_or_weakrefo   s;      	JC   	c??"s88Or%   c                     | 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!   s    r#   __repr__zpromise.__repr__}   sN    %)X:!!7BBDzz"33r$xx333TX
 
 	
r%   c                 d   d| _         	 | j        | j                                         | j        | j        D ]}|                                 t	          | j        t                    r| j                                         d x| _        x| _        | _        d S # d x| _        x| _        | _        w xY w)NT)r   r   cancelr   
isinstancer   r   )r!   pendings     r#   r2   zpromise.cancel   s    		E*&&(((*# % %GNN$$$$$-22 '$$&&&@DDDODdoDDODdoDDDDs   A8B B/c                 @   d }| j         rd S |r
| j        |z   n| j        }|rt          | j        fi |n| j        }|                     | j                  }|Q	 | j        r ||i | d}i }n ||i |}|fi fx| _        \  }}n2# t          $ r | 	                                cY S w xY w||fx| _        \  }}d| _
        | j        }	|		  |	|i | d | _        nH# d | _        w xY w| j        }
	 |
r|
                                } ||i | |
d | _        n# d | _        w xY w|S )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ps               r#   __call__zpromise.__call__   s   > 	F)-<TY%%49
6<MtDK226222$+  **?	$% :C4|444BBB S*===F-3IrM9DJ"b $ $ $zz||###$ %/$<<DJ"b
O	 '	2$$$$"&$&&&&I' !!))++AArLRLLL   ! #'$&&&&s*   +B B$#B$C 	C* D 	Dc                 2    | j         r
 |            n| j        S N)r   r   )r!   r   s     r#   r7   zpromise._fun_is_alive   s    	/ssuuutx/r%   c                    t          |t                    st          ||          }| j        r|                                 |S | j        r|                    | j                   n| j        r| j	        \  }} ||i | | j
        0| j        }|d t          |g          c| _        | _
        n	|| _        |S | j
                            |           |S )N)r   )r3   r   r	   r   r2   r   r9   r   r   r   r   r   r   append)r!   r"   r   r   r   r@   s         r#   r   zpromise.then   s    (H-- 	<x(;;;H> 	OOO; 	&NN4;''''Z 	&:LD&Hd%f%%%?"I$37	{9K9K0"*x(((r%   c                     | j         sP||nt          j                    d         }d|c| _        | _        | j        r | j        | j        |fz   i | j         d S d S d S )Nr   T)r   sysexc_infor   r   r   r   r   )r!   excs     r#   throw1zpromise.throw1   s    ~ 	B##clnnQ.?C'+S$DK} BtyC61AT[AAAAA		B 	BB Br%   Tc                 N   | j         st          j                    d         }||n|}	 |                     |           | j        }|*	 |                    |           d | _        nS# d | _        w xY w| j        }	 |r)|                                                    |           |)d | _        n# d | _        w xY w| j        +|r+||||u r t          t          |          ||           d S d S d S # | j        *|r)||||u r t          t          |          ||           w w w xY wd S )Nr   )
r   rI   rJ   rL   r   r   r:   r   r   r,   )r!   rK   tb	propagatecurrent_excr@   rA   s          r#   r9   zpromise.throw   s   ~ 	0,..+K##kC0C    O	(/!((---*.$.... $I/' <%--//66s;;; ( < +/$....=(Y(zs{c[6H6HDIIsB///// )(((4=(Y(zs{c[6H6HDIIsB//// )('	0 	0s;   C. A% C. %	A..
C. 9+B, $C. ,	B55C. .4D"c                 .    | j         r| j         S | j        gS rE   )r   r   r/   s    r#   	listenerszpromise.listeners   s    ? 	#?"  r%   )NNNNNFFrE   )NNT)r-   
__module____qualname____doc__hasattrrI   	__slots__r$   staticmethodr   r0   r2   rC   r7   r   rL   r9   propertyrR   r   r%   r#   r	   r	      s       : :x 73+,, 

	 4849$. . . .6   \
 
 

E E E$ $ $L0 0 0   *B B B B0 0 0 02 ! ! X! ! !r%   )rU   r'   rI   collectionsr   weakrefr   r   abstractr   utilsr   __all__registerr	   r   r%   r#   <module>r`      s       



       # # # # # # # #            + 
c! c! c! c! c! c! c! c! c! c!r%   