
     h                         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                      ZdS )
zPromise implementation.    N)deque)ref
WeakMethod   )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(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                 ^   || _         || _        |                     ||          | _        |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           I/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/vine/promises.py__init__zpromise.__init__S   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_weakrefn   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"   r1   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"   r6   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   )r2   r   r	   r   r1   r   r8   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   rH   rI   rK   r   r   r9   r   r   r+   )r    rJ   tb	propagatecurrent_excr?   r@   s          r"   r8   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 rD   )r   r   r.   s    r"   	listenerszpromise.listeners   s    ? 	#?"  r$   )NNNNNFFrD   )NNT)r,   
__module____qualname____doc__hasattrrH   	__slots__r#   staticmethodr   r/   r1   rB   r6   r   rK   r8   propertyrQ   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$   )rT   rH   collectionsr   r&   weakrefr   r   abstractr   utilsr   __all__registerr	   r   r$   r"   <module>r_      s      



        # # # # # # # #            + 
a! a! a! a! a! a! a! a! a! a!r$   