
    Be              	          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eeef   eeeef         Zy	)
    )annotations)defaultdict)CallableIterableIteratorMappingMutableMapping)GenericTypeVar)KTVTZictBaseclosediscardflushlockedMKTc                       e Zd ZU dZded<   ded<   ded<   ded	<   	 	 	 	 d fd
ZddZedd       Zedd       Z	edd       Z
ddZddZddZddZeZddZddZ x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
    $Mapping[MKT, MutableMapping[KT, VT]]mappingsCallable[[KT, VT], MKT]selectorz dict[KT, MutableMapping[KT, VT]]key_to_mappingintgenc                Z    t         |           || _        || _        i | _        d| _        y )Nr   )super__init__r   r   r   r   )selfr   r   	__class__s      *lib/python3.12/site-packages/zict/sieve.pyr   zSieve.__init__/   s-    
 	       c                &    | j                   |   |   S Nr   r    keys     r"   __getitem__zSieve.__getitem__:   s     ""3',,r#   c                   t        | |       | j                  ||      }| j                  |   }|| j                  |<   | xj                  dz  c_        | j                  }| j                         5  |||<   d d d        || j                  k7  r+| j                  j                  |      |urt        ||       y y y # 1 sw Y   DxY wN   )r   r   r   r   r   unlockget)r    r(   valuemkeymappingr   s         r"   __setitem__zSieve.__setitem__?   s    c}}S%(--%#*C Ahh[[] 	! GCL	! $((?t2266s;7JGS!  K?	! 	!s   .B77C c                |    | j                   j                  |      }| xj                  dz  c_        t        ||       y r+   )r   popr   r   )r    r(   r1   s      r"   __delitem__zSieve.__delitem__O   s/    %%))#.Ar#   c                   t        t              }| xj                  dz  c_        | j                  }|D ]u  \  }}| j                  j	                  |d       }|t        ||       | j                  ||      }| j                  |   }||   j                  ||f       || j                  |<   w | j                         5  |j                         D ]%  \  }}	| j                  |   }|j                  |	       ' 	 d d d        || j                  k7  r\|j                         D ]H  \  }}	| j                  |   }|	D ]/  \  }}
| j                  j                  |      |us$t        ||       1 J y y # 1 sw Y   uxY wr+   )r   listr   r   r4   r   r   r   appendr-   itemsupdater.   )r    r9   updatesr   r(   r/   old_mappingr0   r1   mitems_s              r"   
_do_updatezSieve._do_updateU   se    d#Ahh 	/JC--11#t<K&S)==e,DmmD)GDM  #u.'.D$	/ [[] 	' ' 'f---v&'	'
 $((? ' .f---$ .FC**..s37B-.. 	' 	's   ;9E))E2c                ,    t        | j                        S r%   )lenr   r    s    r"   __len__zSieve.__len__s   s    4&&''r#   c                ,    t        | j                        S r%   )iterr   rB   s    r"   __iter__zSieve.__iter__v   s    D''((r#   c                    || j                   v S r%   r&   r'   s     r"   __contains__zSieve.__contains__y   s    d))))r#   c                "    d| j                    dS )NzSieve<>)r   rB   s    r"   __str__zSieve.__str__|   s    a((r#   c                D    t        | j                  j                           y r%   )r   r   valuesrB   s    r"   r   zSieve.flush       t}}##%&r#   c                D    t        | j                  j                           y r%   )r   r   rM   rB   s    r"   r   zSieve.close   rN   r#   )r   r   r   r   )r(   r   returnr   )r(   r   r/   r   rP   None)r(   r   rP   rQ   )r9   zIterable[tuple[KT, VT]]rP   rQ   )rP   r   )rP   zIterator[KT])r(   objectrP   bool)rP   str)rP   rQ   )__name__
__module____qualname____doc____annotations__r   r)   r   r2   r5   r?   rC   rF   rH   rK   __repr__r   r   __classcell__)r!   s   @r"   r   r      s    : 32%%44	H	6	 *	-
 " "  
 . .:()*) H''r#   r   N)
__future__r   collectionsr   collections.abcr   r   r   r   r	   typingr
   r   zict.commonr   r   r   r   r   r   r   r   r    r#   r"   <module>rb      sJ    " # Q Q # G G Geny'HRVgb"ck2 y'r#   