B
    ¢X[\  ã               @   sX   d dl mZmZmZ d dlmZ d dlmZ d dlZddl	m
Z
mZ G dd„ de
ƒZdS )	é    )Úabsolute_importÚdivisionÚprint_function)Údefaultdict)ÚchainNé   )ÚZictBaseÚclosec               @   s€   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Z	dd„ Z
dd„ Zdd„ Ze	Zdd„ Zdd„ ZeZdd„ Zdd„ ZdS )ÚSievea   Store values in different mappings based on a selector's
    output.

    This creates a MutableMapping combining several underlying
    MutableMappings for storage.  Items are dispatched based on
    a selector function provided by the user.

    Parameters
    ----------
    mappings: dict of {mapping key: MutableMapping}
    selector: callable (key, value) -> mapping key

    Examples
    --------
    >>> small = {}
    >>> large = DataBase()                        # doctest: +SKIP
    >>> mappings = {True: small, False: large}    # doctest: +SKIP
    >>> def is_small(key, value):                 # doctest: +SKIP
            return sys.getsizeof(value) < 10000
    >>> d = Sieve(mappings, is_small)             # doctest: +SKIP

    See Also
    --------
    Buffer
    c             C   s   || _ || _i | _d S )N)ÚmappingsÚselectorÚkey_to_mapping)Úselfr   r   © r   ú)lib/python3.7/site-packages/zict/sieve.pyÚ__init__$   s    zSieve.__init__c             C   s   | j | | S )N)r   )r   Úkeyr   r   r   Ú__getitem__)   s    zSieve.__getitem__c             C   sJ   | j  |¡}| j|  ||¡ }|d k	r4||k	r4||= |||< || j |< d S )N)r   Úgetr   r   )r   r   ÚvalueÚold_mappingÚmappingr   r   r   Ú__setitem__,   s    zSieve.__setitem__c             C   s   | j  |¡|= d S )N)r   Úpop)r   r   r   r   r   Ú__delitem__4   s    zSieve.__delitem__c             C   sÈ   g }t tƒ}tdd„ | j ¡ D ƒƒ}xZ|D ]R\}}| j |¡}| j|  ||¡ }|d k	rf||k	rf||= |t|ƒ  	||f¡ q*W xB| 
¡ D ]6\}	}
||	 }| |
¡ x|
D ]\}}|| j|< qªW qŠW d S )Nc             s   s   | ]}t |ƒ|fV  qd S )N)Úid)Ú.0Úmr   r   r   ú	<genexpr><   s    z#Sieve._do_update.<locals>.<genexpr>)r   ÚlistÚdictr   Úvaluesr   r   r   r   ÚappendÚitemsÚupdate)r   r#   Z	to_deleteZupdatesZmapping_idsr   r   r   r   ZmidZmitemsÚ_r   r   r   Ú
_do_update7   s    
zSieve._do_updatec             C   s   t  | j ¡ ¡S )N)r   Úfrom_iterabler   r!   )r   r   r   r   ÚkeysL   s    z
Sieve.keysc             C   s   t  dd„ | j ¡ D ƒ¡S )Nc             s   s   | ]}|  ¡ V  qd S )N)r!   )r   r   r   r   r   r   P   s    zSieve.values.<locals>.<genexpr>)r   r'   r   r!   )r   r   r   r   r!   O   s    zSieve.valuesc             C   s   t  dd„ | j ¡ D ƒ¡S )Nc             s   s   | ]}|  ¡ V  qd S )N)r#   )r   r   r   r   r   r   S   s    zSieve.items.<locals>.<genexpr>)r   r'   r   r!   )r   r   r   r   r#   R   s    zSieve.itemsc             C   s   t tt| j ¡ ƒƒS )N)ÚsumÚmapÚlenr   r!   )r   r   r   r   Ú__len__U   s    zSieve.__len__c             C   s
   || j kS )N)r   )r   r   r   r   r   Ú__contains__Z   s    zSieve.__contains__c             C   s   dt | jƒf S )Nz	Sieve<%s>)Ústrr   )r   r   r   r   Ú__str__]   s    zSieve.__str__c             C   s    x| j  ¡ D ]}| ¡  qW d S )N)r   r!   Úflush)r   r   r   r   r   r0   b   s    zSieve.flushc             C   s    x| j  ¡ D ]}t|ƒ qW d S )N)r   r!   r	   )r   r   r   r   r   r	   f   s    zSieve.closeN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r&   r(   r!   r#   r,   Ú__iter__r-   r/   Ú__repr__r0   r	   r   r   r   r   r
   
   s    r
   )Z
__future__r   r   r   Úcollectionsr   Ú	itertoolsr   ÚsysÚcommonr   r	   r
   r   r   r   r   Ú<module>   s
   