U
    /e,                     @   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   0/tmp/pip-unpacked-wheel-ziavv1t7/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 5 |r| j   X d S )Nr   F皙?   )maxcount)r   acquirereleaseitemsr   lenr   r   appendr   keys_to_flushflush)r   datar   kwargskvkeysr   r   r   r+   #   s     
 zBuffer.appendc                 K   sP   |r| j   z,ttt| jj|dd| jj|dd}W 5 |rJ| j   X |S NFr   )	r   r'   r(   listmapr	   r   getr   )r   r2   r   r/   resultr   r   r   _get2   s     

 zBuffer._getc                 C   s:   |r| j   z| jj||dd W 5 |r4| j   X dS )z Idempotent set Fr4   N)r   r'   r(   r   Ziset)r   keyvaluer   r   r   r   _iset;   s     
 zBuffer._isetc                 C   sH   |r| j   z$| jj|dd | jj|dd W 5 |rB| j   X d S r3   )r   r'   r(   r   deleter   )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k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 }|stt|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   s     z!keys_to_flush.<locals>.<listcomp>N)r   maxr*   r)   sumvaluesminr
   r5   r   r	   r   AssertionError)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   ^