a
    fDf,                     @   s   d dl mZ ddlmZ ddlmZmZmZmZ ddl	m
Z
 ddlmZ ddlmZ ddlmZmZ d	d
 ZG dd deZdddZdS )   )	Interface    )Lock)
merge_withtopk
accumulatepluck)add)bisect)defaultdict)QueueEmptyc                   C   s   dS Nr    r   r   r   Y/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/partd/buffer.pyzero
   s    r   c                   @   sh   e Zd ZdddZdd Zdd Zdd	d
ZdddZdddZdddZ	dd Z
dd ZdddZdS )Buffer    eAc                 C   s8   t  | _|| _|| _|| _tt| _d| _t	
|  d S r   )r   lockfastslowavailable_memoryr   r   lengthsmemory_usager   __init__)selfr   r   r   r   r   r   r      s    
zBuffer.__init__c                 C   s   | j | j| j| j| jdS )Nr   r   r   r   r   r   r   r   r   r   __getstate__   s    zBuffer.__getstate__c                 C   s$   t | | t | _| j| d S N)r   __setstate__r   r   __dict__update)r   stater   r   r   r       s    zBuffer.__setstate__Tc                 K   s   |r| j   z| D ]0\}}| j|  t|7  < |  jt|7  _q| jj|fddi| | j| jkrt	| jddd}| 
| qbW |r| j   n|r| j   0 d S )Nr   F皙?   )maxcount)r   acquireitemsr   lenr   r   appendr   keys_to_flushflushrelease)r   datar   kwargskvkeysr   r   r   r*   #   s    zBuffer.appendc                 K   s^   |r| j   z:ttt| jj|dd| jj|dd}W |rZ| j   n|rX| j   0 |S NFr   )	r   r'   listmapr	   r   getr   r-   )r   r2   r   r/   resultr   r   r   _get2   s     zBuffer._getc                 C   sH   |r| j   z$| jj||dd W |rD| j   n|rB| j   0 dS )z Idempotent set Fr4   N)r   r'   r   Zisetr-   )r   keyvaluer   r   r   r   _iset;   s    zBuffer._isetc                 C   sV   |r| j   z2| jj|dd | jj|dd W |rR| j   n|rP| j   0 d S r3   )r   r'   r   deleter   r-   )r   r2   r   r   r   r   _deleteC   s
    zBuffer._deletec                 C   s"   | j   | j  | j  d S r   )Z
_iset_seenclearr   dropr   r   r   r   r   r@   K   s    

zBuffer.dropc                 G   s   |    d S r   )r@   )r   argsr   r   r   __exit__P   s    zBuffer.__exit__Nc                 C   sf   |du rt | j}| jtt|| j| | j| |D ] }|  j	| j| 8  _	| j|= q@dS )a   Flush keys to disk

        Parameters
        ----------

        keys: list or None
            list of keys to flush
        block: bool (defaults to None)
            Whether or not to block until all writing is complete

        If no keys are given then flush all keys
        N)
r5   r   r   r*   dictzipr   r7   r=   r   )r   r2   blockr:   r   r   r   r,   S   s    
zBuffer.flush)r   )T)T)T)T)NN)__name__
__module____qualname__r   r   r    r*   r9   r<   r>   r@   rB   r,   r   r   r   r   r      s   
	

	

r   r$   順 c                 C   sx   t tt| d d|  dd}t|  }t|tdttt	t
td||| }dd |d| D }|stJ |S )z Which keys to remove

    >>> lengths = {'a': 20, 'b': 10, 'c': 15, 'd': 15,
    ...            'e': 10, 'f': 25, 'g': 5}
    >>> keys_to_flush(lengths, 0.5)
    ['f', 'a']
       r   )r:   c                 S   s   g | ]\}}|qS r   r   ).0r0   r1   r   r   r   
<listcomp>z       z!keys_to_flush.<locals>.<listcomp>N)r   maxr)   r(   sumvaluesminr
   r5   r   r	   r   )r   fractionr&   toptotalcutoffr8   r   r   r   r+   k   s    r+   N)r$   rI   )corer   	threadingr   Ztoolzr   r   r   r   operatorr	   r
   collectionsr   queuer   r   r   r   r+   r   r   r   r   <module>   s   ^