B
    ËP•\5  ã               @   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   ú+lib/python3.7/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ç    eÍÍAc             C   s8   t ƒ | _|| _|| _|| _ttƒ| _d| _t	 
| ¡ d S )Nr   )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   )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†x<| ¡ D ]0\}}| j|  t|ƒ7  < |  jt|ƒ7  _qW | jj|fddi|—Ž x*| j| jkrt	| jddd}|  
|¡ qhW W d |r¤| j  ¡  X d S )Nr   Fgš™™™™™¹?é   )Ú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   sP   |r| j  ¡  z,ttt| jj|dd| jj|ddƒƒ}W d |rJ| j  ¡  X |S )NF)r   )	r   r"   ÚlistÚmapr	   r   Úgetr   r(   )r   r-   r   r*   Úresultr   r   r   Ú_get2   s     
 zBuffer._getc             C   s:   |r| j  ¡  z| jj||dd W d|r4| j  ¡  X dS )z Idempotent set F)r   N)r   r"   r   Zisetr(   )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 d |rB| j  ¡  X d S )NF)r   )r   r"   r   Údeleter   r(   )r   r-   r   r   r   r   Ú_deleteC   s     
 zBuffer._deletec             C   s"   | j  ¡  | j ¡  | j ¡  d S )N)Z
_iset_seenÚclearr   Údropr   )r   r   r   r   r9   K   s    

zBuffer.dropc             G   s   |   ¡  d S )N)r9   )r   Úargsr   r   r   Ú__exit__P   s    zBuffer.__exit__Nc             C   sj   |dkrt | jƒ}| j tt|| j |¡ƒƒ¡ | j |¡ x(|D ] }|  j	| j| 8  _	| j|= qBW 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)
r.   r   r   r%   ÚdictÚzipr   r0   r6   r   )r   r-   Úblockr3   r   r   r   r'   S   s    

zBuffer.flush)r   )T)T)T)T)NN)Ú__name__Ú
__module__Ú__qualname__r   r   r   r%   r2   r5   r7   r9   r;   r'   r   r   r   r   r      s   
	

	

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   )r3   c             S   s   g | ]\}}|‘qS r   r   )Ú.0r+   r,   r   r   r   ú
<listcomp>z   s    z!keys_to_flush.<locals>.<listcomp>N)r   Úmaxr$   r#   ÚsumÚvaluesÚminr
   r.   r   r	   r   ÚAssertionError)r   Zfractionr!   ÚtopZtotalÚcutoffr1   r   r   r   r&   k   s    r&   N)rB   rC   )Zcorer   Z	threadingr   Ztoolzr   r   r   r   Úoperatorr	   r
   Úcollectionsr   Zcompatibilityr   r   r   r   r&   r   r   r   r   Ú<module>   s   ^