
    Ih	                    D    d Z ddlmZ ddlmZ ddlmZ dZ G d d      Zy)	z.Token bucket implementation for rate limiting.    )annotations)deque)	monotonic)TokenBucketc                  L    e Zd ZdZdZdZdZddZd Zd Z	d Z
ddZdd	Zd
 Zy)r   a  Token Bucket Algorithm.

    See Also
    --------
        https://en.wikipedia.org/wiki/Token_Bucket

        Most of this code was stolen from an entry in the ASPN Python Cookbook:
        https://code.activestate.com/recipes/511490/

    Warning:
    -------
        Thread Safety: This implementation is not thread safe.
        Access to a `TokenBucket` instance should occur within the critical
        section of any multithreaded code.
    N   c                    t        |      | _        || _        t        |      | _        t	               | _        t               | _        y N)floatcapacity_tokens	fill_rater   	timestampr   contents)selfr   r   s      K/var/www/html/planif/env/lib/python3.12/site-packages/kombu/utils/limits.py__init__zTokenBucket.__init__%   s2    hy)"    c                :    | j                   j                  |       y r
   )r   append)r   items     r   addzTokenBucket.add,   s    T"r   c                6    | j                   j                         S r
   )r   popleftr   s    r   popzTokenBucket.pop/   s    }}$$&&r   c                8    | j                   j                          y r
   )r   clearr   s    r   clear_pendingzTokenBucket.clear_pending2   s    r   c                V    || j                         k  r| xj                  |z  c_        yy)a  Check if one or more tokens can be consumed.

        Returns
        -------
            bool: true if the number of tokens can be consumed
                from the bucket.  If they can be consumed, a call will also
                consume the requested number of tokens from the bucket.
                Calls will only consume `tokens` (the number requested)
                or zero tokens -- it will never consume a partial number
                of tokens.
        TF)_get_tokensr   )r   tokenss     r   can_consumezTokenBucket.can_consume5   s)     T%%''LLF"Lr   c                ^    | j                         }t        ||      }||z
  | j                  z  S )z~Return estimated time of token availability.

        Returns
        -------
            float: the time in seconds.
        )r!   maxr   )r   r"   r   s      r   expected_timezTokenBucket.expected_timeF   s2     ""$VW% DNN22r   c                    | j                   | j                  k  rUt               }| j                  || j                  z
  z  }t        | j                  | j                   |z         | _         || _        | j                   S r
   )r   r   r   r   r   min)r   nowdeltas      r   r!   zTokenBucket._get_tokensQ   s\    <<$--'+CNNcDNN&:;Et}}dllU.BCDL DN||r   )r   )__name__
__module____qualname____doc__r   r   r   r   r   r   r   r#   r&   r!    r   r   r   r      s?    " I H I #'"	3r   r   N)	r.   
__future__r   collectionsr   timer   __all__r   r/   r   r   <module>r4      s"    4 "  
L Lr   