U
    2tc                     @   sL   d dl Z d dlZddlmZ G dd dZG dd dZG dd	 d	eZdS )
    N   )Cachec                   @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
_Link)keyexpirenextprevNc                 C   s   || _ || _d S N)r   r   )selfr   r    r   2/tmp/pip-unpacked-wheel-7ofpm20j/cachetools/ttl.py__init__   s    z_Link.__init__c                 C   s   t | j| jffS r	   )r   r   r   r
   r   r   r   
__reduce__   s    z_Link.__reduce__c                 C   s   | j }| j}||_ ||_d S r	   )r   r   )r
   r   r   r   r   r   unlink   s    z_Link.unlink)NN)__name__
__module____qualname__	__slots__r   r   r   r   r   r   r   r      s   
r   c                   @   s<   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd ZdS )_Timerc                 C   s   || _ d| _d S Nr   )_Timer__timer_Timer__nesting)r
   timerr   r   r   r      s    z_Timer.__init__c                 C   s   | j dkr|  S | jS d S r   r   r   Z_Timer__timer   r   r   r   __call__   s    
z_Timer.__call__c                 C   s2   | j dkr|   | _}n| j}|  j d7  _ |S )Nr   r   r   r
   timer   r   r   	__enter__$   s
    
z_Timer.__enter__c                 G   s   |  j d8  _ d S Nr   )r   )r
   excr   r   r   __exit__,   s    z_Timer.__exit__c                 C   s   t | jffS r	   )r   r   r   r   r   r   r   /   s    z_Timer.__reduce__c                 C   s   t | j|S r	   )getattrr   )r
   namer   r   r   __getattr__2   s    z_Timer.__getattr__N)	r   r   r   r   r   r   r!   r   r$   r   r   r   r   r      s   r   c                       s   e Zd ZdZejdfddZdd Zej	fddZ	ej
fd	d
Z
ejfddZdd Zdd Zdd ZejfddZe fddZedd Ze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  ZS )*TTLCachez@LRU Cache implementation with per-item time-to-live (TTL) value.Nc                 C   sD   t | || t  | _}| |_|_t | _t	|| _
|| _d S r	   )r   r   r   _TTLCache__rootr   r   collectionsOrderedDict_TTLCache__linksr   _TTLCache__timer_TTLCache__ttl)r
   maxsizettlr   	getsizeofrootr   r   r   r   9   s    

zTTLCache.__init__c                 C   s:   z| j | }W n tk
r$   Y dS X |j|  k  S d S NF)r)   KeyErrorr   r*   )r
   r   linkr   r   r   __contains__A   s
    zTTLCache.__contains__c                 C   sR   z|  |}W n tk
r&   d}Y nX |j|  k }|rD| |S || |S d S r0   )_TTLCache__getlinkr1   r   r*   __missing__)r
   r   Zcache_getitemr2   Zexpiredr   r   r   __getitem__I   s    

zTTLCache.__getitem__c              	   C   s   | j }| | || || W 5 Q R X z| |}W n& tk
r\   t| | j|< }Y n
X |  || j |_| j |_	}|j
 |_
}| |_	|_
d S r	   )r*   r   r4   r1   r   r)   r   r+   r&   r   r   )r
   r   valueZcache_setitemr   r2   r/   r   r   r   r   __setitem__U   s    
zTTLCache.__setitem__c                 C   s8   || | | j |}|  |j|  k r4t|d S r	   )r)   popr   r   r*   r1   )r
   r   cache_delitemr2   r   r   r   __delitem__d   s
    
zTTLCache.__delitem__c              	   c   sD   | j }|j}||k	r@| j}|j|k s.|jV  W 5 Q R X |j}qd S r	   )r&   r   r*   r   r   )r
   r/   currr   r   r   r   __iter__k   s    
zTTLCache.__iter__c                 C   sD   | j }|j}|  }t| j}||k	r@|j|k r@|d8 }|j}q|S r   )r&   r   r*   lenr)   r   )r
   r/   r<   r   countr   r   r   __len__u   s    
zTTLCache.__len__c                 C   sj   | j | | j}| |_|_t| j dd dD ]"}||_|j |_}| |_|_q4| | 	  d S )Nc                 S   s   | j S r	   )r   )objr   r   r   <lambda>       z'TTLCache.__setstate__.<locals>.<lambda>)r   )
__dict__updater&   r   r   sortedr)   valuesr   r*   )r
   stater/   r2   r   r   r   r   __setstate__   s    zTTLCache.__setstate__c              
   C   s0   | j  }| | || W  5 Q R  S Q R X d S r	   )r*   r   )r
   Z
cache_reprr   r   r   r   __repr__   s    
zTTLCache.__repr__c              
      s0   | j  }| | t jW  5 Q R  S Q R X d S r	   )r*   r   supercurrsizer   	__class__r   r   rL      s    
zTTLCache.currsizec                 C   s   | j S )z%The timer function used by the cache.)r*   r   r   r   r   r      s    zTTLCache.timerc                 C   s   | j S )z,The time-to-live value of the cache's items.)r+   r   r   r   r   r-      s    zTTLCache.ttlc                 C   sf   |dkr|   }| j}|j}| j}tj}||k	rb|j|k rb|| |j ||j= |j}|  |}q(dS )z$Remove expired items from the cache.N)	r*   r&   r   r)   r   r;   r   r   r   )r
   r   r/   r<   linksr:   r   r   r   r   r      s    zTTLCache.expirec              	   C   s*   | j }| | t|  W 5 Q R X d S r	   )r*   r   r   clearr   r   r   r   rP      s    
zTTLCache.clearc              
   O   s0   | j   tj| f||W  5 Q R  S Q R X d S r	   )r*   r   getr
   argskwargsr   r   r   rQ      s    zTTLCache.getc              
   O   s0   | j   tj| f||W  5 Q R  S Q R X d S r	   )r*   r   r9   rR   r   r   r   r9      s    zTTLCache.popc              
   O   s0   | j   tj| f||W  5 Q R  S Q R X d S r	   )r*   r   
setdefaultrR   r   r   r   rU      s    zTTLCache.setdefaultc              
   C   sv   | j f}| | ztt| j}W n( tk
rL   tdt| j dY nX || 	|fW  5 Q R  S W 5 Q R X dS )zmRemove and return the `(key, value)` pair least recently used that
        has not already expired.

        z%s is emptyN)
r*   r   r   iterr)   StopIterationr1   typer   r9   )r
   r   r   r   r   r   popitem   s    
zTTLCache.popitemc                 C   s   | j | }| j | |S r	   )r)   move_to_end)r
   r   r7   r   r   r   Z	__getlink   s    
zTTLCache.__getlink)N)r   r   r   __doc__r   	monotonicr   r3   r   r6   r8   r;   r=   r@   rI   rJ   propertyrL   r   r-   r   rP   rQ   r9   rU   rY   r4   __classcell__r   r   rM   r   r%   6   s.   





r%   )r'   r   cacher   r   r   r%   r   r   r   r   <module>   s
   