o
    —¨ÊhË)  ã                   @  sP  d Z ddlmZ ddlZddlZddlZddlmZmZ ddl	m
Z
mZ ddlmZmZ ddlmZmZ ddlmZ d	d
lmZ dZeƒ ZG dd„ dƒZG dd„ deƒZddefdd„ZG dd„ dƒZdd„ Zeefe
ffdd„Zeeffdd„Z d2dd„Z!dd„ Z"d3d d!„Z#d4d#d$„Z$		%	d5d'd(„Z%d6d+d,„Z&d7d.d/„Z'd0d1„ Z(eZ)eZ*dS )8zFunctional Utilities.é    )ÚannotationsN)ÚOrderedDictÚUserDict)ÚIterableÚMapping)ÚcountÚrepeat)ÚsleepÚtime)Úwrapsé   )Ú	safe_repr)ÚLRUCacheÚmemoizeÚlazyÚmaybe_evaluateÚis_listÚ
maybe_listÚ
dictfilterÚretry_over_timec                   @  s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚChannelPromisec                 C  s
   || _ d S ©N)Ú__contract__)ÚselfÚcontract© r   úH/var/www/html/env/lib/python3.10/site-packages/kombu/utils/functional.pyÚ__init__   ó   
zChannelPromise.__init__c                 C  s.   z| j W S  ty   |  ¡  }| _ | Y S w r   )Ú	__value__ÚAttributeErrorr   )r   Úvaluer   r   r   Ú__call__   s   þzChannelPromise.__call__c                 C  s4   zt | jƒW S  ty   dt| jƒd›d� Y S w )Nz<promise: 0xÚxú>)Úreprr   r    Úidr   ©r   r   r   r   Ú__repr__%   s
   ÿzChannelPromise.__repr__N)Ú__name__Ú
__module__Ú__qualname__r   r"   r(   r   r   r   r   r      s    r   c                   @  sŽ   e Zd ZdZddd„Zdd„ Zdd„ Zdd
d„Zdd„ Zdd„ Z	dd„ Z
e
Zdd„ ZeZdd„ ZeZddd„Zdd„ Zdd„ ZeZeZe
ZdS ) r   aM  LRU Cache implementation using a doubly linked list to track access.

    Arguments:
    ---------
        limit (int): The maximum number of keys to keep in the cache.
            When a new key is inserted and the limit has been exceeded,
            the *Least Recently Used* key will be discarded from the
            cache.
    Nc                 C  s   || _ t ¡ | _tƒ | _d S r   )ÚlimitÚ	threadingÚRLockÚmutexr   Údata)r   r,   r   r   r   r   7   s   
zLRUCache.__init__c                 C  sB   | j � | j |¡ }| |< |W  d   ƒ S 1 sw   Y  d S r   )r/   r0   Úpop©r   Úkeyr!   r   r   r   Ú__getitem__<   s   $þzLRUCache.__getitem__c                 O  sœ   | j �A | j| j}}|j|i |¤Ž |r,t|ƒ|kr4tt|ƒ| ƒD ]}|jdd� q#W d   ƒ d S W d   ƒ d S W d   ƒ d S 1 sGw   Y  d S )NF)Úlast)r/   r0   r,   ÚupdateÚlenÚrangeÚpopitem)r   ÚargsÚkwargsr0   r,   Ú_r   r   r   r6   A   s   ýýý"ûzLRUCache.updateTc                 C  s6   | j � | j |¡W  d   ƒ S 1 sw   Y  d S r   )r/   r0   r9   )r   r5   r   r   r   r9   J   s   
$ÿzLRUCache.popitemc                 C  sb   | j �$ | jrt| jƒ| jkr| j tt| jƒƒ¡ || j|< W d   ƒ d S 1 s*w   Y  d S r   )r/   r,   r7   r0   r1   ÚnextÚiterr2   r   r   r   Ú__setitem__N   s
   "ýzLRUCache.__setitem__c                 C  s
   t | jƒS r   )r>   r0   r'   r   r   r   Ú__iter__U   r   zLRUCache.__iter__c              
   c  s^   � | j �! | D ]}z
|| j| fV  W q ty   Y qw W d   ƒ d S 1 s(w   Y  d S r   ©r/   r0   ÚKeyError©r   Úkr   r   r   Ú_iterate_itemsX   s   €ÿý"ÿzLRUCache._iterate_itemsc              
   c  sZ   � | j � | D ]}z| j| V  W q ty   Y qw W d   ƒ d S 1 s&w   Y  d S r   rA   rC   r   r   r   Ú_iterate_valuesa   s   €ÿý"ÿzLRUCache._iterate_valuesc                 C  s4   | j � | j ¡ W  d   ƒ S 1 sw   Y  d S r   )r/   r0   Úkeysr'   r   r   r   Ú_iterate_keysk   s   $ÿzLRUCache._iterate_keysr   c                 C  sN   | j � t| j |¡ƒ| }t|ƒ| |< |W  d   ƒ S 1 s w   Y  d S r   )r/   Úintr0   r1   Ústr)r   r3   ÚdeltaÚnewvalr   r   r   Úincrq   s
   $ûzLRUCache.incrc                 C  s   t t| ƒƒ}| d¡ |S )Nr/   )ÚdictÚvarsr1   )r   Údr   r   r   Ú__getstate__y   s   
zLRUCache.__getstate__c                 C  s   || _ t ¡ | _d S r   )Ú__dict__r-   r.   r/   )r   Ústater   r   r   Ú__setstate__~   s   zLRUCache.__setstate__r   )T)r   )r)   r*   r+   Ú__doc__r   r4   r6   r9   r?   r@   rE   Ú	iteritemsrF   Ú
itervaluesrH   ÚiterkeysrM   rQ   rT   rG   ÚvaluesÚitemsr   r   r   r   r   ,   s(    


	
r   c                   s   ‡ ‡‡fdd„}|S )z)Decorator to cache function return value.c                   sX   t  ¡ ‰ˆˆd�‰tˆƒ‡ ‡‡‡‡fdd„ƒ‰ ‡ ‡fdd„}d ˆ _ˆ _|ˆ _ˆˆ _ˆ S )N)r,   c                    sÎ   ˆrˆ| |ƒ}n| t f tt| ¡ ƒƒ }zˆ� ˆ| }W d   ƒ n1 s'w   Y  W n0 ty]   ˆ| i |¤Ž}ˆ  jd7  _ˆ� |ˆ|< W d   ƒ Y |S 1 sUw   Y  Y |S w ˆ  jd7  _|S )Nr   )ÚKEYWORD_MARKÚtupleÚsortedrZ   rB   ÚmissesÚhits)r:   r;   r3   r!   )Ú_MÚcacheÚfunÚkeyfunr/   r   r   r`   �   s(   
ÿ€
ÿüùz%memoize.<locals>._memoize.<locals>._Mc                     s   ˆ  ¡  d ˆ _ˆ _dS )z+Clear the cache and reset cache statistics.r   N)Úclearr_   r^   r   )r`   ra   r   r   rd   Ÿ   s   z(memoize.<locals>._memoize.<locals>.clearr   )r-   ÚLockr   r_   r^   rd   Úoriginal_func)rb   rd   ©ÚCacherc   Úmaxsize)r`   ra   rb   r/   r   Ú_memoize‰   s   
zmemoize.<locals>._memoizer   )ri   rc   rh   rj   r   rg   r   r   ‡   s    r   c                   @  sX   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ ZdS )r   a
  Holds lazy evaluation.

    Evaluated when called or if the :meth:`evaluate` method is called.
    The function is re-evaluated on every call.

    Overloaded operations that will evaluate the promise:
        :meth:`__str__`, :meth:`__repr__`, :meth:`__cmp__`.
    c                 O  s   || _ || _|| _d S r   ©Ú_funÚ_argsÚ_kwargs)r   rb   r:   r;   r   r   r   r   ¶   s   
zlazy.__init__c                 C  s   |   ¡ S r   )Úevaluater'   r   r   r   r"   »   s   zlazy.__call__c                 C  s   | j | ji | j¤ŽS r   rk   r'   r   r   r   ro   ¾   s   zlazy.evaluatec                 C  ó
   t | ƒ ƒS r   )rJ   r'   r   r   r   Ú__str__Á   r   zlazy.__str__c                 C  rp   r   )r%   r'   r   r   r   r(   Ä   r   zlazy.__repr__c                 C  s
   | ƒ |kS r   r   ©r   Úrhsr   r   r   Ú__eq__Ç   r   zlazy.__eq__c                 C  s
   | ƒ |kS r   r   rr   r   r   r   Ú__ne__Ê   r   zlazy.__ne__c                 C  s   | |t | ƒ< | S r   )r&   )r   Úmemor   r   r   Ú__deepcopy__Í   s   zlazy.__deepcopy__c                 C  s   | j | jf| j| jdœfS )N)rm   rn   )Ú	__class__rl   rm   rn   r'   r   r   r   Ú
__reduce__Ñ   s   ÿzlazy.__reduce__N)r)   r*   r+   rU   r   r"   ro   rq   r(   rt   ru   rw   ry   r   r   r   r   r   ¬   s    	r   c                 C  s   t | tƒr	|  ¡ S | S )z9Evaluate value only if value is a :class:`lazy` instance.)Ú
isinstancer   ro   )r!   r   r   r   r   Ö   s   
r   c                 C  s   t | |ƒot | |p
dƒ S )zwReturn true if the object is iterable.

    Note:
    ----
        Returns false if object is a mapping or string.
    r   )rz   )ÚobjÚscalarsÚitersr   r   r   r   Ý   s   r   c                 C  s   | du s	t | |ƒr| S | gS )z0Return list of one element if ``l`` is a scalar.N)r   )r{   r|   r   r   r   r   ç   s   r   c                 K  s6   | du r|n|rt | fi |¤Žn| } dd„ |  ¡ D ƒS )z=Remove all keys from dict ``d`` whose value is :const:`None`.Nc                 S  s   i | ]\}}|d ur||“qS r   r   ©Ú.0rD   Úvr   r   r   Ú
<dictcomp>ï   s    zdictfilter.<locals>.<dictcomp>)rN   rZ   )rP   Úkwr   r   r   r   ì   s   $r   c                 c  s4   � t | ƒ} tj}td ƒD ]}|| ƒ | d V  qd S )Nr   )ÚlistÚrandomÚshuffler   )Úitr…   r<   r   r   r   Úshufflecycleò   s   €þr‡   ç      ð?Fc                 c  s<   � | d }	 |r||kr|V  ||7 }n	|sd S || V  q)Nrˆ   r   )ÚstartÚstopÚstepÚ
repeatlastÚcurr   r   r   Úfxrangeú   s   €

ùrŽ   ç      Y@c                 c  sJ   � d| d }}	 ||krd S |V  |rt || |ƒ}n||7 }||7 }q	)Nr   rˆ   )Úmin)r‰   rŠ   r‹   ÚmaxÚsum_r�   r   r   r   Ú
fxrangemax  s   €ør“   é   é   c                 C  s
  |si n|}|s
g n|}t ||| |dd�}|
rtƒ |
 nd}tƒ D ]`}z
| |i |¤ŽW   S  |y‚ } zH|dur?||kr?‚ |rGtƒ |krG‚ |	rL|	ƒ  t|rU||||ƒnt|ƒƒ}|rxtt|ƒƒD ]}|	ri|	ƒ  tdƒ qbttt|ƒ| ƒƒ W Y d}~q"d}~ww dS )a  Retry the function over and over until max retries is exceeded.

    For each retry we sleep a for a while before we try again, this interval
    is increased for every retry until the max seconds is reached.

    Arguments:
    ---------
        fun (Callable): The function to try
        catch (Tuple[BaseException]): Exceptions to catch, can be either
            tuple or a single exception class.

    Keyword Arguments:
    -----------------
        args (Tuple): Positional arguments passed on to the function.
        kwargs (Dict): Keyword arguments passed on to the function.
        errback (Callable): Callback for when an exception in ``catch``
            is raised.  The callback must take three arguments:
            ``exc``, ``interval_range`` and ``retries``, where ``exc``
            is the exception instance, ``interval_range`` is an iterator
            which return the time in seconds to sleep next, and ``retries``
            is the number of previous retries.
        max_retries (int): Maximum number of retries before we give up.
            If neither of this and timeout is set, we will retry forever.
            If one of this and timeout is reached, stop.
        interval_start (float): How long (in seconds) we start sleeping
            between retries.
        interval_step (float): By how much the interval is increased for
            each retry.
        interval_max (float): Maximum number of seconds to sleep
            between retries.
        timeout (int): Maximum seconds waiting before we give up.
    T)rŒ   Nrˆ   )	rŽ   r
   r   Úfloatr=   r8   rI   r	   Úabs)rb   Úcatchr:   r;   ÚerrbackÚmax_retriesÚinterval_startÚinterval_stepÚinterval_maxÚcallbackÚtimeoutÚinterval_rangeÚendÚretriesÚexcÚttsr<   r   r   r   r     s:   #þ
ÿ
€ñýr   ú, ú{0}={1}c                   s   |  ‡ fdd„|  ¡ D ƒ¡S )Nc                 3  s$   � | ]\}}ˆ   |t|ƒ¡V  qd S r   )ÚformatÚ
_safe_reprr~   ©Úfmtr   r   Ú	<genexpr>R  s   €" zreprkwargs.<locals>.<genexpr>)ÚjoinrZ   )r;   Úseprª   r   r©   r   Ú
reprkwargsQ  s   r®   r   c                 C  s>   |si n|}d  | | tt|pdƒ¡|r|r|pdt||ƒ¡S )Nz
{}({}{}{})r   Ú )r§   r¬   Úmapr¨   r®   )Únamer:   r;   r­   r   r   r   ÚreprcallU  s   ýr²   c                 C  s   t  | ¡}||jv p||jv S r   )ÚinspectÚgetfullargspecr:   Ú
kwonlyargs)ÚfuncÚargument_nameÚargument_specr   r   r   Úaccepts_argument^  s   

þr¹   r   )rˆ   Nrˆ   F)rˆ   Nrˆ   r�   )	NNNNr”   r”   r•   NN)r¥   r¦   )r   Nr¥   )+rU   Ú
__future__r   r³   r„   r-   Úcollectionsr   r   Úcollections.abcr   r   Ú	itertoolsr   r   r
   r	   Ú
vine.utilsr   Úencodingr   r¨   Ú__all__Úobjectr[   r   r   r   r   r   rJ   r   r   r   r‡   rŽ   r“   r   r®   r²   r¹   ÚpromiseÚmaybe_promiser   r   r   r   Ú<module>   sB    [%*




þ
>
		