o
    q`                     @   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   .lib/python3.10/site-packages/cachetools/ttl.py__init__      
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      r   z_Timer.__init__c                 C   s   | j dkr	|  S | j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   /      z_Timer.__reduce__c                 C   s   t | j|S r	   )getattrr   )r
   namer   r   r   __getattr__2   r#   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   s4   z| j | }W n
 ty   Y dS w |j|  k  S NF)r+   KeyErrorr   r,   )r
   r   linkr   r   r   __contains__A   s   zTTLCache.__contains__c                 C   sL   z|  |}W n ty   d}Y nw |j|  k }|r!| |S || |S r2   )_TTLCache__getlinkr3   r   r,   __missing__)r
   r   Zcache_getitemr4   Zexpiredr   r   r   __getitem__I   s   

zTTLCache.__getitem__c                 C   s   | j }| | || || W d    n1 sw   Y  z| |}W n ty7   t| | j|< }Y nw |  || j |_| j |_	}|j
 |_
}| |_	|_
d S r	   )r,   r   r6   r3   r   r+   r   r-   r(   r   r   )r
   r   valueZcache_setitemr   r4   r1   r   r   r   r   __setitem__U   s   
zTTLCache.__setitem__c                 C   s8   || | | j |}|  |j|  k rt|d S r	   )r+   popr   r   r,   r3   )r
   r   cache_delitemr4   r   r   r   __delitem__d   s   
zTTLCache.__delitem__c                 c   sd    | j }|j}||ur0| j}|j|k s|jV  W d    n1 s"w   Y  |j}||usd S d S r	   )r(   r   r,   r   r   )r
   r1   currr   r   r   r   __iter__k   s   
zTTLCache.__iter__c                 C   sT   | j }|j}|  }t| j}||ur(|j|k r(|d8 }|j}||ur(|j|k s|S r    )r(   r   r,   lenr+   r   )r
   r1   r>   r   countr   r   r   __len__u   s   
zTTLCache.__len__c                 C   sj   | j | | j}| |_|_t| j dd dD ]}||_|j |_}| |_|_q| | 	  d S )Nc                 S      | j S r	   )r   )objr   r   r   <lambda>   s    z'TTLCache.__setstate__.<locals>.<lambda>)r   )
__dict__updater(   r   r   sortedr+   valuesr   r,   )r
   stater1   r4   r   r   r   r   __setstate__   s   zTTLCache.__setstate__c                 C   s<   | j }| | || W  d    S 1 sw   Y  d S r	   )r,   r   )r
   Z
cache_reprr   r   r   r   __repr__   s   
$zTTLCache.__repr__c                    s<   | j }| | t jW  d    S 1 sw   Y  d S r	   )r,   r   supercurrsizer   	__class__r   r   rN      s   
$zTTLCache.currsizec                 C   rC   )z%The timer function used by the cache.)r,   r   r   r   r   r         zTTLCache.timerc                 C   rC   )z,The time-to-live value of the cache's items.)r-   r   r   r   r   r/      rQ   zTTLCache.ttlc                 C   s   |du r|   }| j}|j}| j}tj}||ur;|j|k r?|| |j ||j= |j}|  |}||ur=|j|k sdS dS dS dS )z$Remove expired items from the cache.N)	r,   r(   r   r+   r   r=   r   r   r   )r
   r   r1   r>   Zlinksr<   r   r   r   r   r      s   "zTTLCache.expirec                 C   s@   | j }| | t|  W d    d S 1 sw   Y  d S r	   )r,   r   r   clearr   r   r   r   rR      s   
"zTTLCache.clearc                 O   B   | j  tj| g|R i |W  d    S 1 sw   Y  d S r	   )r,   r   getr
   argskwargsr   r   r   rT         $zTTLCache.getc                 O   rS   r	   )r,   r   r;   rU   r   r   r   r;      rX   zTTLCache.popc                 O   rS   r	   )r,   r   
setdefaultrU   r   r   r   rY      rX   zTTLCache.setdefaultc              	   C   sx   | j /}| | z	tt| j}W n ty#   tdt| j dw || 	|fW  d   S 1 s5w   Y  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+   StopIterationr3   typer   r;   )r
   r   r   r   r   r   popitem   s   
$zTTLCache.popitemc                 C   s   | j | }| j | |S r	   )r+   move_to_end)r
   r   r9   r   r   r   Z	__getlink   s   
zTTLCache.__getlinkr	   )r   r   r   __doc__r   	monotonicr   r5   r   r8   r:   r=   r?   rB   rK   rL   propertyrN   r   r/   r   rR   rT   r;   rY   r]   r6   __classcell__r   r   rO   r   r'   6   s0    





r'   )r)   r   cacher   r   r   r'   r   r   r   r   <module>   s    