U
    /e                     @  s   d dl mZ d dlmZ d dlmZmZmZmZm	Z	 d dl
mZmZ d dlmZmZmZmZmZmZmZ edZG dd deeef eeeef Zd	S )
    )annotations)defaultdict)CallableIterableIteratorMappingMutableMapping)GenericTypeVar)KTVTZictBaseclosediscardflushlockedMKTc                      s   e Zd ZU dZded< ded< ded< ded	< ddd
 fddZdddddZeddddddZedddddZ	edddddZ
ddddZddd d!Zd"d#dd$d%Zd&dd'd(ZeZddd)d*Zddd+d,Z  Z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

    Notes
    -----
    If you call methods of this class from multiple threads, access will be fast as long
    as the ``__contains__`` and ``__delitem__`` methods of all underlying mappins are
    fast. ``__getitem__`` and ``__setitem__`` methods of the underlying mappings are not
    protected by locks.

    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   # doctest: +SKIP
    >>> d = Sieve(mappings, is_small)             # doctest: +SKIP
    z$Mapping[MKT, MutableMapping[KT, VT]]mappingszCallable[[KT, VT], MKT]selectorz dict[KT, MutableMapping[KT, VT]]key_to_mappingintgen)r   r   c                   s&   t    || _|| _i | _d| _d S )Nr   )super__init__r   r   r   r   )selfr   r   	__class__ ./tmp/pip-unpacked-wheel-z3s6s24u/zict/sieve.pyr   /   s
    
zSieve.__init__r   r   )keyreturnc                 C  s   | j | | S Nr   r   r    r   r   r   __getitem__:   s    zSieve.__getitem__None)r    valuer!   c              	   C  s   t | | | ||}| j| }|| j|< |  jd7  _| j}|   |||< W 5 Q R X || jkr~| j||k	r~t || d S N   )r   r   r   r   r   unlockget)r   r    r'   mkeymappingr   r   r   r   __setitem__?   s    



zSieve.__setitem__c                 C  s(   | j |}|  jd7  _t|| d S r(   )r   popr   r   )r   r    r-   r   r   r   __delitem__O   s    zSieve.__delitem__zIterable[tuple[KT, VT]])itemsr!   c              	   C  s
  t t}|  jd7  _| j}|D ]Z\}}| j|d }|d k	rHt|| | ||}| j| }|| ||f || j|< q | 	 , |
 D ]\}}	| j| }||	 qW 5 Q R X || jkr|
 D ]:\}}	| j| }|	D ]"\}}
| j||k	rt|| qqd S r(   )r   listr   r   r/   r   r   r   appendr*   r1   updater+   )r   r1   Zupdatesr   r    r'   Zold_mappingr,   r-   Zmitems_r   r   r   
_do_updateU   s*    




zSieve._do_update)r!   c                 C  s
   t | jS r"   )lenr   r   r   r   r   __len__s   s    zSieve.__len__zIterator[KT]c                 C  s
   t | jS r"   )iterr   r8   r   r   r   __iter__v   s    zSieve.__iter__objectboolc                 C  s
   || j kS r"   r#   r$   r   r   r   __contains__y   s    zSieve.__contains__strc                 C  s   d| j  dS )NzSieve<>)r   r8   r   r   r   __str__|   s    zSieve.__str__c                 C  s   t | j   d S r"   )r   r   valuesr8   r   r   r   r      s    zSieve.flushc                 C  s   t | j   d S r"   )r   r   rB   r8   r   r   r   r      s    zSieve.close)__name__
__module____qualname____doc____annotations__r   r%   r   r.   r0   r6   r9   r;   r>   rA   __repr__r   r   __classcell__r   r   r   r   r      s(   
r   N)
__future__r   collectionsr   collections.abcr   r   r   r   r   typingr	   r
   Zzict.commonr   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s   $