o
    ˷e                     @   s   d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZ g dZede
dZedZG dd	 d	e	eef Zed
ee
df dZedZG dd deeef Zededef dZddedeegef fddZdS )    )deque)wraps)	AnyCallableDequeDictGenericHashableTupleTypeVarcast)SimpleCacheFastDictCachememoized_T)bound_Uc                   @   sL   e Zd ZdZddeddfddZded	eg ef defd
dZ	dddZ
dS )r   z
    Very simple cache that discards the oldest item when the cache size is
    exceeded.

    :param maxsize: Maximum size of the cache. (Don't make it too big.)
       maxsizereturnNc                 C   s$   |dksJ i | _ t | _|| _d S Nr   )_datar   _keysr   )selfr    r   K/var/www/ideatree/venv/lib/python3.10/site-packages/prompt_toolkit/cache.py__init__   s   
zSimpleCache.__init__keygetter_funcc                 C   sl   z| j | W S  ty5   | }|| j |< | j| t| j | jkr1| j }|| j v r1| j |= | Y S w )z
        Get object from the cache.
        If not found, call `getter_func` to resolve it, and put that on the top
        of the cache instead.
        )r   KeyErrorr   appendlenr   popleft)r   r   r   valuekey_to_remover   r   r   get   s   


zSimpleCache.getc                 C   s   i | _ t | _dS )zClear cache.N)r   r   r   )r   r   r   r   clear5   s   zSimpleCache.clear)r   )r   N)__name__
__module____qualname____doc__intr   r   r   r   r%   r&   r   r   r   r   r      s
    r   _K._Vc                   @   sB   e Zd ZdZddedef deddfdd	Zd
edefddZ	dS )r   a  
    Fast, lightweight cache which keeps at most `size` items.
    It will discard the oldest items in the cache first.

    The cache is a dictionary, which doesn't keep track of access counts.
    It is perfect to cache little immutable objects which are not expensive to
    create, but where a dictionary lookup is still much faster than an object
    instantiation.

    :param get_value: Callable that's called in case of a missing key.
    @B 	get_value.sizer   Nc                 C   s$   |dksJ t  | _|| _|| _d S r   )r   r   r/   r0   )r   r/   r0   r   r   r   r   T   s   
zFastDictCache.__init__r   c                 C   sH   t | | jkr| j }|| v r| |= | j| }|| |< | j| |S N)r!   r0   r   r"   r/   r    )r   r   r$   resultr   r   r   __missing__[   s   

zFastDictCache.__missing__)r.   )
r'   r(   r)   r*   r   r-   r+   r   r,   r3   r   r   r   r   r   ?   s     r   _F   r   r   c                    s   dt dt f fdd}|S )zI
    Memoization decorator for immutable classes and pure functions.
    objr   c                    s8   t d tdtdtdtf fdd}tt|S )Nr   akwr   c                     s6   dt f fdd} tt f}||S )Nr   c                      s    i S r1   r   r   )r8   r9   r6   r   r   
create_newu   s   zEmemoized.<locals>.decorator.<locals>.new_callable.<locals>.create_new)r   tuplesorteditemsr%   )r8   r9   r:   r   cacher6   )r8   r9   r   new_callables   s   z1memoized.<locals>.decorator.<locals>.new_callable)r   r   r   r   r4   )r6   r@   r7   r>   r   	decoratorp   s   

zmemoized.<locals>.decorator)r4   )r   rA   r   r7   r   r   k   s   r   N)r5   )collectionsr   	functoolsr   typingr   r   r   r   r   r	   r
   r   r   __all__r   r   r   r,   r-   r   objectr4   r+   r   r   r   r   r   <module>   s    ,,)"