U
    .enc                     @   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-f4liivr4/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>6   s      zlpmerge.<locals>.<listcomp>)__setitem__items)LRr   r1   r   r)   /   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>   F   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>   Q   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edd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__k   s    
zAttributeDictMixin.__getattr__N)rA   returnc                 C   s   || |< dS )z"`d[key] = value -> d.key = value`.Nr   r<   rA   valuer   r   r   __setattr__t   s    zAttributeDictMixin.__setattr__)r   r   r   rF   rM   strrQ   r   r   r   r   r   e   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    y   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)objectrQ   )r<   rS   r   r   r   __init__   s    zDictAttribute.__init__c                 C   s   t | j|S r-   )getattrrS   r<   rA   r   r   r   rM      s    zDictAttribute.__getattr__c                 C   s   t | j||S r-   setattrrS   rO   r   r   r   rQ      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   r[   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-   )rV   rS   rK   rJ   rW   r   r   r   __getitem__   s    zDictAttribute.__getitem__c                 C   s   t | j|| d S r-   rX   rO   r   r   r   r4      s    zDictAttribute.__setitem__c                 C   s   t | j|S r-   )rG   rS   rW   r   r   r   __contains__   s    zDictAttribute.__contains__c                 C   s   t t| jS r-   )r9   dirrS   r;   r   r   r   _iterate_keys   s    zDictAttribute._iterate_keysc                 C   s   |   S r-   rb   r;   r   r   r   __iter__   s    zDictAttribute.__iter__c                 c   s$   |   D ]}|t| j|fV  qd S r-   rb   rV   rS   rW   r   r   r   _iterate_items   s    zDictAttribute._iterate_itemsc                 c   s    |   D ]}t| j|V  qd S r-   re   rW   r   r   r   _iterate_values   s    zDictAttribute._iterate_values)N)N)r   r   r   rF   rS   rU   rM   rQ   r]   r^   r_   r4   r`   rb   iterkeysrd   rf   	iteritemsrg   
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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d4ddZdd Zdd Zdd Zdd ZeZd5d 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#d0d1 Z$e$Z%d2d3 Z&e Z'e"Z(e$Z)dS )6r"   z!Key lookup on a sequence of maps.Nr   c                 O   s:   t |p
i g}| jj|d||d |dd  g d d S )Nkey_tr   r   )rl   mapschangesdefaults
_observers)list__dict__updater]   )r<   rm   kwargsr   r   r   rU      s    
zChainMap.__init__c                 C   s(   t |}| jd| | jd| d S rC   )r(   ro   insertrm   )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: )rm   r@   rJ   r[   r   r   r   r@      s    zChainMap.popc                 C   s   t |d S r-   rZ   rW   r   r   r   __missing__   s    zChainMap.__missing__c                 C   s   | j d k	r|  |S |S r-   )rl   rW   r   r   r   _key   s    zChainMap._keyc              	   C   sD   |  |}| jD ](}z|| W   S  tk
r6   Y qX q| |S r-   )ry   rm   rJ   rx   )r<   rA   ry   mappingr   r   r   r_      s    

zChainMap.__getitem__c                 C   s   || j | |< d S r-   rn   ry   rO   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: )rn   ry   rJ   rW   r   r   r   __delitem__  s    zChainMap.__delitem__c                 C   s   | j   d S r-   rn   clearr;   r   r   r   r~   	  s    zChainMap.clearc                 C   s.   z| |  | W S  tk
r(   | Y S X d S r-   )ry   rJ   r[   r   r   r   r]     s    zChainMap.getc                 C   s   t t j| j S r-   )lensetunionrm   r;   r   r   r   __len__  s    zChainMap.__len__c                 C   s   |   S r-   rc   r;   r   r   r   rd     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>)ry   anyrm   rW   r   r   r   r`     s    
zChainMap.__contains__c                 C   s
   t | jS r-   )r   rm   r;   r   r   r   __bool__   s    zChainMap.__bool__c                 C   s   |  |}|| kr|| |< d S r-   )ry   r[   r   r   r   r^   %  s    
zChainMap.setdefaultc                 O   s(   | j j||}| jD ]}||| q|S r-   )rn   rs   rp   )r<   argsrt   resultcallbackr   r   r   rs   +  s    
zChainMap.updatec                 C   s   d | dtt| jS )Nz{0.__class__.__name__}({1})z, )formatjoinmapreprrm   r;   r   r   r   __repr__2  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   7  s    zChainMap.fromkeysc                 C   s$   | j | jd  f| jdd   S rC   )	__class__rm   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.   rv   opr   r   r   H  s     z!ChainMap._iter.<locals>.<genexpr>)r   reversedrm   )r<   r   r   r   r   _iterB  s    zChainMap._iterc                 C   s   t | dd S )Nc                 S   s   |   S r-   r:   )rv   r   r   r   <lambda>L      z(ChainMap._iterate_keys.<locals>.<lambda>)r   r   r;   r   r   r   rb   J  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   Q  s     z*ChainMap._iterate_items.<locals>.<genexpr>r   r;   r   r;   r   rf   O  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   V  s     z+ChainMap._iterate_values.<locals>.<genexpr>r   r;   r   r;   r   rg   T  s    zChainMap._iterate_valuesc                 C   s   | j | d S r-   )rp   append)r<   r   r   r   r   bind_toY  s    zChainMap.bind_to)N)N)*r   r   r   rF   rl   rn   ro   rm   rp   rU   rw   r@   rx   ry   r_   r4   r|   r~   r]   r   rd   r`   r   __nonzero__r^   rs   r   classmethodr   r   __copy__r   rb   rh   rf   ri   rg   rj   r   r:   r5   rk   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)superrU   rr   rs   rstrip)r<   rn   ro   r:   r   r   r   r   rU   o  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_keysx  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   rx   r   r   )r<   rA   r:   getitemr/   r   r   r   r_     s"    
 zConfigurationView.__getitem__c                 C   s   || j | |< d S r-   r{   rO   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-   rZ   r[   r   r   r   r]     s    
zConfigurationView.getc                 C   s   | j   dS )z&Remove all changes, but keep defaults.Nr}   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   rm   rW   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 )Nrn   ro   rl   r   )rn   ro   rl   r   rm   )rr   rs   )r<   otherrn   ro   r   r   r   	swap_with  s    

zConfigurationView.swap_with)NNN)N)r   r   r   rF   rU   r   r_   r4   r   r]   r~   r`   r   __classcell__r   r   r   r   r#   a  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-e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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_heaprs   
ValueError)r<   r   r   datar   r   r   r   rU     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   rk   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   rs   r   r   r   r5   r   rq   floatr   rL   r   )r<   r   rA   insertedrS   r   r   r   rs      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   A  s    
 zLimitedSet.purgerN   c                 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<   r\   r   r   r   r   r   r@   V  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>q  s      z&LimitedSet.as_dict.<locals>.<dictcomp>)r   rk   r;   r   r   r   as_dictc  s    zLimitedSet.as_dictc                 C   s   | j |j kS r-   r   )r<   r   r   r   r   __eq__s  s    zLimitedSet.__eq__c                 C   s   t j| t| jt| dS )N)namesize)REPR_LIMITED_SETr   rL   r   r   r;   r   r   r   r   w  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   rk   r;   r   r   r   rd   }  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   rW   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   rU   r   r   r~   r   rs   r   Z	pop_valuer   r   r@   r   r   r   rd   r   r`   r   r   r   propertyr   r   r   r   r   r&     s.   5


r&   c                   @   sF   e Zd ZdZeZddddZdefedddd	Zddd
dZ	dS )r%   z2Mixin for classes supporting the ``evict`` method.Nr   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   )limitrN   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<   r   r   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._evict1)
r   r   r   rF   r   r   r   intr   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ed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   rU     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<   r\   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   rd     s    zMessagebuffer.__iter__c                 C   s   |   S r-   )r   r;   r   r   r   r     s    zMessagebuffer.__len__r   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   rU   r   r   r   r   r   rd   r   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   rU   r   
bufmaxsizers   sumr5   total)r<   r   r   r   r   r   r   rU     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   r\   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   4  s
    
zBufferMap._get_or_create_bufferc                 C   s   | j | jdS )N)r   )Bufferr   r;   r   r   r   r   <  s    zBufferMap._new_bufferc                 G   s   | |    j| S r-   )r=   r   r   r   r   r   _LRUpop@  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   D  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   Y  s    zBufferMap.__repr__c                 C   s   | j S r-   )r   r;   r   r   r   r   ]  s    zBufferMap._evictcount)Nr   )r   r   r   rF   r'   r   r   r   r   r   rU   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 b
F
