U
    d#d                     @   s  d Z ddlZddlmZ ddlmZ ddlmZmZm	Z	m
Z
mZ ddlmZmZmZ ddlmZmZ ddlmZ dd	lmZmZmZmZ d
dlmZmZ d
dlmZ zddlm Z! W n e"k
r   dZ!Y nX zddl#m$Z$m%Z% W n( e"k
r
   G dd dZ$e$Z%Y nX dZ&dZ'dd Z(dd Z)G dd deZG dd dZ*G dd de+e*Z,G dd dZ-e	.e- G dd  d e	Z/G d!d" d"e/e*Z0G d#d$ d$Z1e
.e1 G d%d& d&Z2G d'd( d(e2Z3e.e3 G d)d* d*ee2Z4dS )+z8Custom maps, sets, sequences, and other data structures.    N)OrderedDict)deque)CallableMappingMutableMapping
MutableSetSequence)heapifyheappopheappush)chaincount)Empty)AnyDictIterableList   )firstuniq)
match_case)reversed_dict)
LazyObjectLazySettingsc                   @   s   e Zd ZdS )r   N)__name__
__module____qualname__ r   r   </tmp/pip-unpacked-wheel-9cz4377o/celery/utils/collections.pyr      s   r   )AttributeDictMixinAttributeDict	BufferMapChainMapConfigurationViewDictAttribute	Evictable
LimitedSetMessagebufferr   force_mappinglpmergezK<{name}({size}): maxlen={0.maxlen}, expires={0.expires}, minlen={0.minlen}>c                 C   s*   t | ttfr| j} t | ts&t| S | S )z?Wrap object into supporting the mapping interface if necessary.)
isinstancer   r   Z_wrappedr   r$   mr   r   r   r(   (   s    r(   c                    s    | j   fdd| D  | S )zpIn place left precedent dictionary merge.

    Keeps values from `L`, if the value in `R` is :const:`None`.
    c                    s"   g | ]\}}|d k	r ||qS Nr   ).0kvsetitemr   r   
<listcomp>7   s      zlpmerge.<locals>.<listcomp>)__setitem__items)LRr   r1   r   r)   0   s    r)   c                   @   s<   e Zd ZdZdd Zeeds8er.d
ddZn
dddZd	S )r   z#Dict where insertion order matters.c                 C   s   t t|  S r-   )nextiterkeysselfr   r   r   _LRUkey>   s    zOrderedDict._LRUkeymove_to_endTc                 C   s   |st d| || |< d S )Nzno last=True on PyPy)NotImplementedErrorpop)r<   keylastr   r   r   r>   G   s    zOrderedDict.move_to_endc                 C   s   | j | }|d }|d }||d< ||d< | j}|r^|d }||d< ||d< | |d< |d< n(|d }||d< ||d< | |d< |d< d S Nr   r   )Z_OrderedDict__mapZ_OrderedDict__root)r<   rA   rB   linkZ	link_prevZ	link_nextrootZ
first_noder   r   r   r>   R   s    
N)T)T)	r   r   r   __doc__r=   hasattr_OrderedDict_dict_is_orderedr>   r   r   r   r   r   ;   s   
r   c                   @   s    e Zd ZdZdd Zdd ZdS )r   z[Mixin for Mapping interface that adds attribute access.

    I.e., `d.key -> d[key]`).
    c                 C   s<   z
| | W S  t k
r6   tt| jd|Y nX dS )z`d.key -> d[key]`.z object has no attribute N)KeyErrorAttributeErrortyper   )r<   r/   r   r   r   __getattr__l   s    
zAttributeDictMixin.__getattr__c                 C   s   || |< dS )z"`d[key] = value -> d.key = value`.Nr   r<   rA   valuer   r   r   __setattr__u   s    zAttributeDictMixin.__setattr__N)r   r   r   rF   rM   rP   r   r   r   r   r   f   s   	r   c                   @   s   e Zd ZdZdS )r    z$Dict subclass with attribute access.N)r   r   r   rF   r   r   r   r   r    {   s   r    c                   @   s   e Zd 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dd Zdd ZeZdd Zdd ZeZdd ZeZeZeZeZdS )r$   z[Dict interface to attributes.

    `obj[k] -> obj.k`
    `obj[k] = val -> obj.k = val`
    Nc                 C   s   t | d| d S )Nobj)objectrP   )r<   rQ   r   r   r   __init__   s    zDictAttribute.__init__c                 C   s   t | j|S r-   )getattrrQ   r<   rA   r   r   r   rM      s    zDictAttribute.__getattr__c                 C   s   t | j||S r-   setattrrQ   rN   r   r   r   rP      s    zDictAttribute.__setattr__c                 C   s(   z
| | W S  t k
r"   | Y S X d S r-   rJ   r<   rA   defaultr   r   r   get   s    
zDictAttribute.getc                 C   s   || kr|| |< d S r-   r   rY   r   r   r   
setdefault   s    zDictAttribute.setdefaultc                 C   s0   zt | j|W S  tk
r*   t|Y nX d S r-   )rT   rQ   rK   rJ   rU   r   r   r   __getitem__   s    zDictAttribute.__getitem__c                 C   s   t | j|| d S r-   rV   rN   r   r   r   r4      s    zDictAttribute.__setitem__c                 C   s   t | j|S r-   )rG   rQ   rU   r   r   r   __contains__   s    zDictAttribute.__contains__c                 C   s   t t| jS r-   )r9   dirrQ   r;   r   r   r   _iterate_keys   s    zDictAttribute._iterate_keysc                 C   s   |   S r-   r`   r;   r   r   r   __iter__   s    zDictAttribute.__iter__c                 c   s$   |   D ]}|t| j|fV  qd S r-   r`   rT   rQ   rU   r   r   r   _iterate_items   s    zDictAttribute._iterate_itemsc                 c   s    |   D ]}t| j|V  qd S r-   rc   rU   r   r   r   _iterate_values   s    zDictAttribute._iterate_values)N)N)r   r   r   rF   rQ   rS   rM   rP   r[   r\   r]   r4   r^   r`   iterkeysrb   rd   	iteritemsre   
itervaluesr5   r:   valuesr   r   r   r   r$      s(   

r$   c                   @   s  e Zd ZdZdZdZdZdZg 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d3ddZdd Zdd Zdd Zdd ZeZd4dd Zd!d" Zd#d$ Zed%d& Zd'd( ZeZd)d* Zd+d, Z e Z!d-d. Z"e"Z#d/d0 Z$e$Z%d1d2 Z&e Z'e"Z(e$Z)dS )5r"   z!Key lookup on a sequence of maps.Nc                 O   s8   t |p
i g}| jj|d||d |dd  d d S )Nkey_tr   r   )rj   mapschangesdefaults)list__dict__updater[   )r<   rk   kwargsr   r   r   rS      s    
zChainMap.__init__c                 C   s(   t |}| jd| | jd| d S rC   )r(   rm   insertrk   )r<   dr   r   r   add_defaults   s    zChainMap.add_defaultsc                 G   s@   z| j d j|f| W S  tk
r:   td|Y nX d S )Nr   z$Key not found in the first mapping: )rk   r@   rJ   rY   r   r   r   r@      s    zChainMap.popc                 C   s   t |d S r-   rX   rU   r   r   r   __missing__   s    zChainMap.__missing__c                 C   s   | j d k	r|  |S |S r-   )rj   rU   r   r   r   _key   s    zChainMap._keyc              	   C   sD   |  |}| jD ](}z|| W   S  tk
r6   Y qX q| |S r-   )rv   rk   rJ   ru   )r<   rA   rv   mappingr   r   r   r]      s    

zChainMap.__getitem__c                 C   s   || j | |< d S r-   rl   rv   rN   r   r   r   r4      s    zChainMap.__setitem__c                 C   s:   z| j | |= W n" tk
r4   td|Y nX d S )Nz Key not found in first mapping: )rl   rv   rJ   rU   r   r   r   __delitem__  s    zChainMap.__delitem__c                 C   s   | j   d S r-   rl   clearr;   r   r   r   r{   
  s    zChainMap.clearc                 C   s.   z| |  | W S  tk
r(   | Y S X d S r-   )rv   rJ   rY   r   r   r   r[     s    zChainMap.getc                 C   s   t t j| j S r-   )lensetunionrk   r;   r   r   r   __len__  s    zChainMap.__len__c                 C   s   |   S r-   ra   r;   r   r   r   rb     s    zChainMap.__iter__c                    s"   |    t fdd| jD S )Nc                 3   s   | ]} |kV  qd S r-   r   )r.   r,   rA   r   r   	<genexpr>  s     z(ChainMap.__contains__.<locals>.<genexpr>)rv   anyrk   rU   r   r   r   r^     s    
zChainMap.__contains__c                 C   s
   t | jS r-   )r   rk   r;   r   r   r   __bool__!  s    zChainMap.__bool__c                 C   s   |  |}|| kr|| |< d S r-   )rv   rY   r   r   r   r\   &  s    
zChainMap.setdefaultc                 O   s(   | j j||}| jD ]}||| q|S r-   )rl   rp   
_observers)r<   argsrq   resultcallbackr   r   r   rp   ,  s    
zChainMap.updatec                 C   s   d | dtt| jS )Nz{0.__class__.__name__}({1})z, )formatjoinmapreprrk   r;   r   r   r   __repr__3  s     zChainMap.__repr__c                 G   s   | t j|f| S )z?Create a ChainMap with a single dict created from the iterable.)dictfromkeys)clsiterabler   r   r   r   r   8  s    zChainMap.fromkeysc                 C   s$   | j | jd  f| jdd   S rC   )	__class__rk   copyr;   r   r   r   r   >  s    zChainMap.copyc                    s   t  fddt| jD  S )Nc                 3   s   | ]} |V  qd S r-   r   )r.   rs   opr   r   r   I  s     z!ChainMap._iter.<locals>.<genexpr>)r   reversedrk   )r<   r   r   r   r   _iterC  s    zChainMap._iterc                 C   s   t | dd S )Nc                 S   s   |   S r-   r:   )rs   r   r   r   <lambda>M      z(ChainMap._iterate_keys.<locals>.<lambda>)r   r   r;   r   r   r   r`   K  s    zChainMap._iterate_keysc                    s    fdd D S )Nc                 3   s   | ]}| | fV  qd S r-   r   r.   rA   r;   r   r   r   R  s     z*ChainMap._iterate_items.<locals>.<genexpr>r   r;   r   r;   r   rd   P  s    zChainMap._iterate_itemsc                    s    fdd D S )Nc                 3   s   | ]} | V  qd S r-   r   r   r;   r   r   r   W  s     z+ChainMap._iterate_values.<locals>.<genexpr>r   r;   r   r;   r   re   U  s    zChainMap._iterate_valuesc                 C   s   | j | d S r-   )r   append)r<   r   r   r   r   bind_toZ  s    zChainMap.bind_to)N)N)*r   r   r   rF   rj   rl   rm   rk   r   rS   rt   r@   ru   rv   r]   r4   ry   r{   r[   r   rb   r^   r   __nonzero__r\   rp   r   classmethodr   r   __copy__r   r`   rf   rd   rg   re   rh   r   r:   r5   ri   r   r   r   r   r"      sN   




r"   c                       sh   e Zd ZdZd fdd	Zdd Z fddZd	d
 Zdd ZdddZ	dd Z
dd Zdd Z  ZS )r#   a  A view over an applications configuration dictionaries.

    Custom (but older) version of :class:`collections.ChainMap`.

    If the key does not exist in ``changes``, the ``defaults``
    dictionaries are consulted.

    Arguments:
        changes (Mapping): Map of configuration changes.
        defaults (List[Mapping]): List of dictionaries containing
            the default configuration.
    Nc                    sH   |d krg n|}t  j|f|  | jj|r:|dd n||d d S )N_)prefix_keys)superrS   ro   rp   rstrip)r<   rl   rm   r:   r   r   r   r   rS   p  s    zConfigurationView.__init__c                 C   s4   | j }|r.||s|| n|}t|||fS |fS r-   )r   
startswithr   )r<   rA   r   Zpkeyr   r   r   _to_keysy  s
    zConfigurationView._to_keysc              	      s   |   }t j}|| jr2t fdd| jD nd D ](}z||W   S  tk
r^   Y q8X q8z|  W S  tk
r   t|dkrtdj|  Y nX d S )Nc                 3   s   | ]}| V  qd S r-   r   )r.   fr   r   r   r     s     z0ConfigurationView.__getitem__.<locals>.<genexpr>r   r   z)Key not found: {0!r} (with prefix: {0!r}))	r   r   r]   r   tuplerJ   ru   r|   r   )r<   rA   r:   getitemr/   r   r   r   r]     s"    
 zConfigurationView.__getitem__c                 C   s   || j | |< d S r-   rx   rN   r   r   r   r4     s    zConfigurationView.__setitem__c                    s   t d  fdd|D S )Nc                 3   s   | ]}  |V  qd S r-   )r[   r   r;   r   r   r     s     z*ConfigurationView.first.<locals>.<genexpr>)r   )r<   r:   r   r;   r   r     s    zConfigurationView.firstc                 C   s(   z
| | W S  t k
r"   | Y S X d S r-   rX   rY   r   r   r   r[     s    
zConfigurationView.getc                 C   s   | j   dS )z&Remove all changes, but keep defaults.Nrz   r;   r   r   r   r{     s    zConfigurationView.clearc                    s"   |  | t fdd| jD S )Nc                 3   s$   | ] t  fd dD V  qdS )c                 3   s   | ]}| kV  qd S r-   r   )r.   r/   r+   r   r   r     s     z;ConfigurationView.__contains__.<locals>.<genexpr>.<genexpr>N)r   )r.   r   r+   r   r     s     z1ConfigurationView.__contains__.<locals>.<genexpr>)r   r   rk   rU   r   r   r   r^     s    
zConfigurationView.__contains__c                 C   s@   |j d }|j d }| j j|||j d |j d |g| d d S )Nrl   rm   rj   r   )rl   rm   rj   r   rk   )ro   rp   )r<   otherrl   rm   r   r   r   	swap_with  s    

zConfigurationView.swap_with)NNN)N)r   r   r   rF   rS   r   r]   r4   r   r[   r{   r^   r   __classcell__r   r   r   r   r#   b  s   	
r#   c                   @   s   e Zd ZdZdZd+ddZdd Zd	d
 Zdd Zd,ddZ	dd Z
dd ZeZd-ddZd.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'd( ZeZed)d* ZdS )/r&   a/  Kind-of Set (or priority queue) with limitations.

    Good for when you need to test for membership (`a in set`),
    but the set should not grow unbounded.

    ``maxlen`` is enforced at all times, so if the limit is reached
    we'll also remove non-expired items.

    You can also configure ``minlen``: this is the minimal residual size
    of the set.

    All arguments are optional, and no limits are enabled by default.

    Arguments:
        maxlen (int): Optional max number of items.
            Adding more items than ``maxlen`` will result in immediate
            removal of items sorted by oldest insertion time.

        expires (float): TTL for all items.
            Expired items are purged as keys are inserted.

        minlen (int): Minimal residual size of this set.
            .. versionadded:: 4.0

            Value must be less than ``maxlen`` if both are configured.

            Older expired items will be deleted, only after the set
            exceeds ``minlen`` number of items.

        data (Sequence): Initial data to initialize set with.
            Can be an iterable of ``(key, value)`` pairs,
            a dict (``{key: insertion_time}``), or another instance
            of :class:`LimitedSet`.

    Example:
        >>> s = LimitedSet(maxlen=50000, expires=3600, minlen=4000)
        >>> for i in range(60000):
        ...     s.add(i)
        ...     s.add(str(i))
        ...
        >>> 57000 in s  # last 50k inserted values are kept
        True
        >>> '10' in s  # '10' did expire and was purged from set.
        False
        >>> len(s)  # maxlen is reached
        50000
        >>> s.purge(now=time.monotonic() + 7200)  # clock + 2 hours
        >>> len(s)  # now only minlen items are cached
        4000
        >>>> 57000 in s  # even this item is gone now
        False
       r   Nc                 C   s   |d krdn|| _ |d krdn|| _|d kr0dn|| _i | _g | _|rP| | | j | j  krhdksrn td| jdk rtdd S )Nr   z:minlen must be a positive number, less or equal to maxlen.zexpires cannot be negative!)maxlenminlenexpires_data_heaprp   
ValueError)r<   r   r   datar   r   r   r   rS     s    

zLimitedSet.__init__c                 C   s,   dd | j  D | jdd< t| j dS )z=Time consuming recreating of heap.  Don't run this too often.c                 S   s   g | ]}|qS r   r   )r.   entryr   r   r   r3     s     z,LimitedSet._refresh_heap.<locals>.<listcomp>N)r   ri   r   r	   r;   r   r   r   _refresh_heap  s    zLimitedSet._refresh_heapc                 C   s   | j | jkr|   d S r-   )_heap_overloadmax_heap_percent_overloadr   r;   r   r   r   _maybe_refresh_heap
  s    zLimitedSet._maybe_refresh_heapc                 C   s   | j   g | jdd< dS )z)Clear all data, start from scratch again.N)r   r{   r   r;   r   r   r   r{     s    
zLimitedSet.clearc                 C   s`   |p
t  }|| jkr | | ||f}|| j|< t| j| | jr\t| j| jkr\|   dS )z=Add a new item, or reset the expiry time of an existing item.N)	time	monotonicr   discardr   r   r   r|   purge)r<   itemnowr   r   r   r   add  s    


zLimitedSet.addc                 C   s   |sdS t |tr2| j|j |   |   nvt |tr| D ]L\}}t |tt	frb|d }t |t
stdt|d| | || qDn|D ]}| | qdS )z8Update this set from other LimitedSet, dict or iterable.Nr   z$Expecting float timestamp, got type z with value: )r*   r&   r   rp   r   r   r   r5   r   rn   floatr   rL   r   )r<   r   rA   insertedrQ   r   r   r   rp   !  s"    



zLimitedSet.updatec                 C   s   | j |d  |   d S r-   )r   r@   r   r<   r   r   r   r   r   ;  s    zLimitedSet.discardc                 C   s   |p
t  }t|tr| n|}| jr@t| j| jkr@|   q&| jrt| j| j	  krbdkrn n(| j
d \}}|| j |krq|   qFdS )zCheck oldest items and remove them if needed.

        Arguments:
            now (float): Time of purging -- by default right now.
                This can be useful for unit testing.
        r   N)r   r   r*   r   r   r|   r   r@   r   r   r   )r<   r   Zinserted_timer   r   r   r   r   B  s    
 zLimitedSet.purgec                 C   sD   | j r@t| j \}}z| j| W n tk
r8   Y q X |S q |S )z?Remove and return the oldest item, or :const:`None` when empty.)r   r
   r   r@   rJ   )r<   rZ   r   r   r   r   r   r@   W  s    zLimitedSet.popc                 C   s   dd | j  D S )a6  Whole set as serializable dictionary.

        Example:
            >>> s = LimitedSet(maxlen=200)
            >>> r = LimitedSet(maxlen=200)
            >>> for i in range(500):
            ...     s.add(i)
            ...
            >>> r.update(s.as_dict())
            >>> r == s
            True
        c                 S   s   i | ]\}}||qS r   r   )r.   r   rA   r   r   r   
<dictcomp>r  s      z&LimitedSet.as_dict.<locals>.<dictcomp>)r   ri   r;   r   r   r   as_dictd  s    zLimitedSet.as_dictc                 C   s   | j |j kS r-   r   r<   r   r   r   r   __eq__t  s    zLimitedSet.__eq__c                 C   s   |  | S r-   )r   r   r   r   r   __ne__x  s    zLimitedSet.__ne__c                 C   s   t j| t| jt| dS )N)namesize)REPR_LIMITED_SETr   rL   r   r|   r;   r   r   r   r   |  s
      zLimitedSet.__repr__c                 C   s   dd t | j D S )Nc                 s   s   | ]\}}|V  qd S r-   r   )r.   r   ir   r   r   r     s     z&LimitedSet.__iter__.<locals>.<genexpr>)sortedr   ri   r;   r   r   r   rb     s    zLimitedSet.__iter__c                 C   s
   t | jS r-   )r|   r   r;   r   r   r   r     s    zLimitedSet.__len__c                 C   s
   || j kS r-   r   rU   r   r   r   r^     s    zLimitedSet.__contains__c                 C   s   | j | j| j|  | jffS r-   )r   r   r   r   r   r;   r   r   r   
__reduce__  s       zLimitedSet.__reduce__c                 C   s
   t | jS r-   )boolr   r;   r   r   r   r     s    zLimitedSet.__bool__c                 C   s"   t | jd tt | jd d S )z5Compute how much is heap bigger than data [percents].d   r   )r|   r   maxr   r;   r   r   r   r     s    zLimitedSet._heap_overload)r   r   Nr   )N)N)N)r   r   r   rF   r   rS   r   r   r{   r   rp   r   Z	pop_valuer   r@   r   r   r   r   rb   r   r^   r   r   r   propertyr   r   r   r   r   r&     s0   5



r&   c                   @   s2   e Zd ZdZeZdd ZdefddZdd Zd	S )
r%   z2Mixin for classes supporting the ``evict`` method.c                 C   s   | j td dS )z&Force evict until maxsize is enforced.)rangeN)_evictr   r;   r   r   r   evict  s    zEvictable.evictr   c                    s4   z fdd||D  W n t k
r.   Y nX d S )Nc                    s   g | ]}   qS r   )_evict1)r.   r   r;   r   r   r3     s     z$Evictable._evict.<locals>.<listcomp>)
IndexError)r<   limitr   r   r;   r   r     s    zEvictable._evictc                 C   s@   | j | jkrt z|   W n | jk
r:   t Y nX d S r-   )_evictcountmaxsizer   _pop_to_evictr   r;   r   r   r   r     s    zEvictable._evict1N)	r   r   r   rF   r   r   r   r   r   r   r   r   r   r%     s
   r%   c                   @   s~   e Zd ZdZeZdef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d Zdd Zedd ZdS )r'   zA buffer of pending messages.Nc                 C   s@   || _ ||pg | _| jj| _| jj| _| jj| _| jj| _	d S r-   )
r   r   r   _appendpopleft_popr   _lenextend_extend)r<   r   r   r   r   r   r   rS     s    


zMessagebuffer.__init__c                 C   s   |  | | jo|   d S r-   )r   r   r   r   r   r   r   put  s    
zMessagebuffer.putc                 C   s   |  | | jo|   d S r-   )r   r   r   )r<   itr   r   r   r     s    
zMessagebuffer.extendc                 G   s<   z
|   W S  tk
r6   |r*|d  Y S |  Y nX d S )Nr   )r   r   r   r<   rZ   r   r   r   take  s    
zMessagebuffer.takec                 C   s   |   S r-   )r   r;   r   r   r   r     s    zMessagebuffer._pop_to_evictc                 C   s$   dt | j dt|  d| j dS N<z: />)rL   r   r|   r   r;   r   r   r   r     s    zMessagebuffer.__repr__c                 c   s.   z|   V  W q  tk
r&   Y q*Y q X q d S r-   )r   r   r;   r   r   r   rb     s    zMessagebuffer.__iter__c                 C   s   |   S r-   )r   r;   r   r   r   r     s    zMessagebuffer.__len__c                 C   s
   || j kS r-   r   r   r   r   r   r^     s    zMessagebuffer.__contains__c                 C   s
   t | jS r-   )r   r   r;   r   r   r   __reversed__  s    zMessagebuffer.__reversed__c                 C   s
   | j | S r-   r   )r<   indexr   r   r   r]     s    zMessagebuffer.__getitem__c                 C   s   t | S r-   r|   r;   r   r   r   r     s    zMessagebuffer._evictcount)r   r   r   rF   r   r   rS   r   r   r   r   r   rb   r   r^   r   r]   r   r   r   r   r   r   r'     s   		r'   c                       s   e Zd ZdZeZeZdZdZdZ	d f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edd Z  ZS )r!   zMap of buffers.Nr     c                    s@   t    || _d| _|r$| | tdd |  D | _d S )Nr   c                 s   s   | ]}t |V  qd S r-   r   )r.   bufr   r   r   r     s     z%BufferMap.__init__.<locals>.<genexpr>)r   rS   r   
bufmaxsizerp   sumr5   total)r<   r   r   r   r   r   r   rS     s    

zBufferMap.__init__c                 C   s:   |  || |  jd7  _| | | jo4|   d S )Nr   )_get_or_create_bufferr   r   r>   r   r   )r<   rA   r   r   r   r   r     s    
zBufferMap.putc                 C   s4   |  || |  jt|7  _| jo.|   d S r-   )r   r   r   r|   r   r   )r<   rA   r   r   r   r   r   !  s    zBufferMap.extendc                 G   s   d\}}z| | }W n t k
r,   d}Y nBX z| }|  jd8  _W n | jk
rb   d}Y nX | | |r|r~|d S |  |S )N)NFTr   r   )rJ   r   r   r   r>   )r<   rA   rZ   r   throwr   r   r   r   r   '  s     


zBufferMap.takec                 C   s8   z
| | W S  t k
r2   |   }| |< | Y S X d S r-   )rJ   _new_buffer)r<   rA   r   r   r   r   r   =  s
    
zBufferMap._get_or_create_bufferc                 C   s   | j | jdS )N)r   )Bufferr   r;   r   r   r   r   E  s    zBufferMap._new_bufferc                 G   s   | |    j| S r-   )r=   r   r   r   r   r   _LRUpopI  s    zBufferMap._LRUpopc              
   C   s   t dD ]v}|  }| | }z|  W n$ t| jfk
rL   | | Y qX |  jd8  _t|sp| | n
| |  qqd S )Nr   r   )	r   r=   r   r   r   r@   r   r|   r>   )r<   r   rA   r   r   r   r   r   M  s    
zBufferMap._pop_to_evictc                 C   s"   dt | j d| j d| j dS r   )rL   r   r   r   r;   r   r   r   r   b  s    zBufferMap.__repr__c                 C   s   | j S r-   )r   r;   r   r   r   r   f  s    zBufferMap._evictcount)Nr   )r   r   r   rF   r'   r   r   r   r   r   rS   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r!     s"   	r!   )5rF   r   collectionsr   rH   r   collections.abcr   r   r   r   r   heapqr	   r
   r   	itertoolsr   r   queuer   typingr   r   r   r   Z
functionalr   r   textr   Z__pypy__r   rI   ImportErrorZdjango.utils.functionalr   r   __all__r   r(   r)   r   r   r    r$   registerr"   r#   r&   r%   r'   r!   r   r   r   r   <module>   sL   

+J
 X f
G
