B
    X[\                 @   sL   d dl mZmZmZ d dlmZ ddlmZmZ dd ZG dd deZ	d	S )
    )absolute_importdivisionprint_function)heapdict   )ZictBaseclosec             C   s   d S )N )kvr	   r	   'lib/python3.7/site-packages/zict/lru.py
do_nothing   s    r   c               @   s   e Zd ZdZdd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dd Zdd Zdd ZeZdd Zdd  ZdS )!LRUa   Evict Least Recently Used Elements

    Parameters
    ----------
    n: int
        Number of elements to keep, or total weight if weight= is used
    d: MutableMapping
        Dictionary in which to hold elements
    on_evict: list of callables
        Function:: k, v -> action to call on key value pairs prior to eviction
    weight: callable
        Function:: k, v -> number to determine the size of keeping the item in
        the mapping.  Defaults to ``(k, v) -> 1``

    Examples
    --------
    >>> lru = LRU(2, dict(), on_evict=lambda k, v: print("Lost", k, v))
    >>> lru['x'] = 1
    >>> lru['y'] = 2
    >>> lru['z'] = 3
    Lost x 1
    Nc             C   s   dS )Nr   r	   )r
   r   r	   r	   r   <lambda>#   s    zLRU.<lambda>c             C   sJ   || _ || _t | _d| _t|r(|g}|p.g | _|| _d| _t	 | _
d S )Nr   )dnr   heapicallableon_evictweighttotal_weightdictweights)selfr   r   r   r   r	   r	   r   __init__#   s    
zLRU.__init__c             C   s(   | j | }|  jd7  _| j| j|< |S )Nr   )r   r   r   )r   keyresultr	   r	   r   __getitem__/   s    
zLRU.__getitem__c             C   s   || j kr| |= | ||}|| jkrd|| j |< |  jd7  _| j| j|< || j|< |  j|7  _nx| jD ]}||| qlW x| j| jkr|   qW d S )Nr   )	r   r   r   r   r   r   r   r   evict)r   r   valuer   cbr	   r	   r   __setitem__5   s    



zLRU.__setitem__c             C   sX   | j  \}}| j|}|  j|8  _| j|}x| jD ]}||| q<W |||fS )z Evict least recently used key

        This is typically called from internal use, but can be externally
        triggered as well.

        Returns
        -------
        k: key
        v: value
        w: weight
        )r   popitemr   popr   r   r   )r   r
   Zpriorityr   r   r!   r	   r	   r   r   I   s    z	LRU.evictc             C   s*   | j |= | j|= |  j| j|8  _d S )N)r   r   r   r   r$   )r   r   r	   r	   r   __delitem__]   s    zLRU.__delitem__c             C   s
   | j  S )N)r   keys)r   r	   r	   r   r&   b   s    zLRU.keysc             C   s
   | j  S )N)r   values)r   r	   r	   r   r'   e   s    z
LRU.valuesc             C   s
   | j  S )N)r   items)r   r	   r	   r   r(   h   s    z	LRU.itemsc             C   s
   t | jS )N)lenr   )r   r	   r	   r   __len__k   s    zLRU.__len__c             C   s
   t | jS )N)iterr   )r   r	   r	   r   __iter__n   s    zLRU.__iter__c             C   s
   || j kS )N)r   )r   r   r	   r	   r   __contains__q   s    zLRU.__contains__c             C   s,   t | jtst| jnd}d| j| j|f S )Nr   z<LRU: %s/%s on %s>)
isinstancer   r   strr   r   )r   subr	   r	   r   __str__t   s    zLRU.__str__c             C   s   | j   d S )N)r   flush)r   r	   r	   r   r2   z   s    z	LRU.flushc             C   s   t | j d S )N)r   r   )r   r	   r	   r   r   }   s    z	LRU.close)__name__
__module____qualname____doc__r   r   r"   r   r%   r&   r'   r(   r*   r,   r-   r1   __repr__r2   r   r	   r	   r	   r   r      s    r   N)
Z
__future__r   r   r   r   commonr   r   r   r   r	   r	   r	   r   <module>   s   