U
    -e                     @  s   d dl mZ 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 dddg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ddddZdS )    )annotations)deque)wraps)	AnyCallableDequeDictGenericHashableTupleTypeVarcastSimpleCacheFastDictCachememoized_T)bound_Uc                   @  sB   e Zd ZdZddddddZdd	d
dddZd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.)
       intNonemaxsizereturnc                 C  s$   |dkst i | _t | _|| _d S Nr   )AssertionError_datar   _keysr   )selfr    r   U/var/www/html/Darija-Ai-Train/env/lib/python3.8/site-packages/prompt_toolkit/cache.py__init__   s    zSimpleCache.__init__r   zCallable[[], _U]r   )keygetter_funcr   c                 C  sr   z| j | W S  tk
rl   | }|| j |< | j| t| j | jkrd| j }|| j krd| j |= | Y S X dS )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.
        N)r   KeyErrorr   appendlenr   popleft)r   r"   r#   valuekey_to_remover   r   r    get    s    


zSimpleCache.getr   c                 C  s   i | _ t | _dS )zClear cache.N)r   r   r   )r   r   r   r    clear7   s    zSimpleCache.clearN)r   )__name__
__module____qualname____doc__r!   r*   r,   r   r   r   r    r      s   _K._Vc                   @  s4   e Zd ZdZdddddddZd	d
d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 zCallable[..., _V]r   r   )	get_valuesizer   c                 C  s$   |dkst t | _|| _|| _d S r   )r   r   r   r4   r5   )r   r4   r5   r   r   r    r!   V   s    zFastDictCache.__init__r1   r2   )r"   r   c                 C  sH   t | | jkr&| j }|| kr&| |= | j| }|| |< | j| |S N)r&   r5   r   r'   r4   r%   )r   r"   r)   resultr   r   r    __missing__]   s    

zFastDictCache.__missing__N)r3   )r-   r.   r/   r0   r!   r8   r   r   r   r    r   A   s   _F   r   zCallable[[_F], _F]r   c                   s   ddd fdd}|S )zI
    Memoization decorator for immutable classes and pure functions.
    r9   )objr   c                   s4   t d tdddd fdd}tt|S )Nr   r   )akwr   c                    s6   dd fdd} t t f}||S )Nr   r+   c                     s
    S r6   r   r   )r=   r>   r;   r   r    
create_neww   s    zEmemoized.<locals>.decorator.<locals>.new_callable.<locals>.create_new)tuplesorteditemsr*   )r=   r>   r?   r"   cacher;   )r=   r>   r    new_callableu   s    z1memoized.<locals>.decorator.<locals>.new_callable)r   r   r   r9   )r;   rE   r<   rC   r    	decoratorr   s    
zmemoized.<locals>.decoratorr   )r   rF   r   r<   r    r   m   s    N)r:   )
__future__r   collectionsr   	functoolsr   typingr   r   r   r   r	   r
   r   r   r   __all__r   r   r   r1   r2   r   objectr9   r   r   r   r   r    <module>   s   ,,)