Ë
    UV.jé  ã                  óÈ   — d Z ddlmZ ddlZddlmZ ddlmZ er2ddlm	Z	 ddlm
Z
mZ ej                  dk  rdd	lmZ ndd	lmZ  ed
«      ZdZ G d„ d«      Z G d„ d«      Zy)z&Semaphores and concurrency primitives.é    )ÚannotationsN)Údeque)ÚTYPE_CHECKING)ÚTracebackType)ÚCallableÚDeque)é   é
   )Ú	ParamSpecÚP)Ú	DummyLockÚLaxBoundedSemaphorec                  ó\   — e Zd ZdZd
d„Z	 	 	 	 	 	 	 	 dd„Zdd„Zddd„Zddd„Zdd„Z	dd„Z
y	)r   aû  Asynchronous Bounded Semaphore.

    Lax means that the value will stay within the specified
    range even if released more times than it was acquired.

    Example:
    -------
        >>> x = LaxBoundedSemaphore(2)

        >>> x.acquire(print, 'HELLO 1')
        HELLO 1

        >>> x.acquire(print, 'HELLO 2')
        HELLO 2

        >>> x.acquire(print, 'HELLO 3')
        >>> x._waiters   # private, do not access directly
        [print, ('HELLO 3',)]

        >>> x.release()
        HELLO 3
    c                óª   — |x| _         | _        t        «       | _        | j                  j                  | _        | j                  j                  | _        y ©N)Úinitial_valueÚvaluer   Ú_waitingÚappendÚ_add_waiterÚpopleftÚ_pop_waiter)Úselfr   s     ú^C:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\kombu/asynchronous/semaphore.pyÚ__init__zLaxBoundedSemaphore.__init__-   s>   € Ø*/Ð/ˆÔ˜TœZÜ&+£gˆŒØŸ=™=×/Ñ/ˆÔØŸ=™=×0Ñ0ˆÕó    c                óˆ   — | j                   }|dk  r| j                  |||f«       yt        |dz
  d«      | _          ||i |¤Ž y)a^  Acquire semaphore.

        This will immediately apply ``callback`` if
        the resource is available, otherwise the callback is suspended
        until the semaphore is released.

        Arguments:
        ---------
            callback (Callable): The callback to apply.
            *partial_args (Any): partial arguments to callback.
        r   Fé   T)r   r   Úmax)r   ÚcallbackÚpartial_argsÚpartial_kwargsr   s        r   ÚacquirezLaxBoundedSemaphore.acquire3   sN   € ð" —
‘
ˆØ�AŠ:Ø×Ñ˜h¨°nÐEÔFØä˜U Q™Y¨Ó*ˆDŒJÙ�lÐ5 nÒ5Ør   c                ó¬   — 	 | j                  «       \  }}} ||i |¤Ž y# t        $ r+ t        | j                  dz   | j                  «      | _        Y yw xY w)z¸Release semaphore.

        Note:
        ----
            If there are any waiters this will apply the first waiter
            that is waiting for the resource (FIFO order).
        r   N)r   Ú
IndexErrorÚminr   r   )r   ÚwaiterÚargsÚkwargss       r   ÚreleasezLaxBoundedSemaphore.releaseM   sZ   € ð	$Ø#'×#3Ñ#3Ó#5Ñ ˆF�D˜&ñ �DÐ#˜FÓ#øô ò 	AÜ˜TŸZ™Z¨!™^¨T×-?Ñ-?Ó@ˆDŽJð	Aús   ‚ Ÿ1AÁAc                ó˜   — | xj                   |z  c_         | xj                  |z  c_        t        |«      D ]  }| j                  «        Œ y)z6Change the size of the semaphore to accept more users.N)r   r   Úranger*   )r   ÚnÚ_s      r   ÚgrowzLaxBoundedSemaphore.grow\   s7   € à×Ò˜aÑÕØ�
Š
�a‰�
Ü�q–ˆAØ�L‰L�Nñ r   c                ó|   — t        | j                  |z
  d«      | _        t        | j                  |z
  d«      | _        y)z6Change the size of the semaphore to accept less users.r   N)r   r   r   )r   r-   s     r   ÚshrinkzLaxBoundedSemaphore.shrinkc   s2   € ä  ×!3Ñ!3°aÑ!7¸Ó;ˆÔÜ˜Ÿ™ a™¨Ó+ˆ�
r   c                óZ   — | j                   j                  «        | j                  | _        y)z@Reset the semaphore, which also wipes out any waiting callbacks.N)r   Úclearr   r   ©r   s    r   r3   zLaxBoundedSemaphore.clearh   s   € à�‰×ÑÔØ×'Ñ'ˆ�
r   c                óž   — dj                  | j                  j                  t        | «      | j                  t        | j                  «      «      S )Nz!<{} at {:#x} value:{} waiting:{}>)ÚformatÚ	__class__Ú__name__Úidr   Úlenr   r4   s    r   Ú__repr__zLaxBoundedSemaphore.__repr__m   s9   € Ø2×9Ñ9Ø�N‰N×#Ñ#¤R¨£X¨t¯z©z¼3¸t¿}¹}Ó;Mó
ð 	
r   N)r   ÚintÚreturnÚNone)r    zCallable[P, None]r!   zP.argsr"   zP.kwargsr=   Úbool)r=   r>   )r   )r-   r<   r=   r>   )r=   Ústr)r8   Ú
__module__Ú__qualname__Ú__doc__r   r#   r*   r/   r1   r3   r;   © r   r   r   r      sP   „ ñó.1ðà#ðð ðð #ð	ð
 
óó4$ôô,ó
(ô

r   r   c                  ó0   — e Zd ZdZdd„Z	 	 	 	 	 	 	 	 dd„Zy)r   zPretending to be a lock.c                ó   — | S r   rD   r4   s    r   Ú	__enter__zDummyLock.__enter__v   s   € Øˆr   c                 ó   — y r   rD   )r   Úexc_typeÚexc_valÚexc_tbs       r   Ú__exit__zDummyLock.__exit__y   s   € ð 	r   N)r=   r   )rI   ztype[BaseException] | NonerJ   zBaseException | NonerK   zTracebackType | Noner=   r>   )r8   rA   rB   rC   rG   rL   rD   r   r   r   r   s   s5   „ Ù"óðà,ðð &ðð %ð	ð
 
ôr   r   )rC   Ú
__future__r   ÚsysÚcollectionsr   Útypingr   Útypesr   r   r   Úversion_infoÚtyping_extensionsr   r   Ú__all__r   r   rD   r   r   Ú<module>rU      sV   ðÙ ,Ý "ã 
Ý Ý  áÝ#ß&Ø
×Ñ˜'Ò!Þ/å$á�#‹€Aà
.€÷[
ñ [
÷|ò r   