ó
¢X[\c           @   sP   d  d l  m Z d d l m Z m Z d d l m Z d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   chaini   (   t   ZictBaset   close(   t   LRUt   Bufferc           B   s§   e  Z d  Z d „  d d d „ Z d „  Z d „  Z d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z e Z d „  Z d „  Z RS(   s   Buffer one dictionary on top of another

    This creates a MutableMapping by combining two MutableMappings, one that
    feeds into the other when it overflows, based on an LRU mechanism.  When
    the first evicts elements these get placed into the second.  When an item
    is retrieved from the second it is placed back into the first.

    Parameters
    ----------
    fast: MutableMapping
    slow: MutableMapping
    fast_to_slow_callbacks: list of callables
        These functions run every time data moves from the fast to the slow
        mapping.  They take two arguments, a key and a value
    slow_to_fast_callbacks: list of callables
        These functions run every time data moves form the slow to the fast
        mapping.

    Examples
    --------
    >>> fast = dict()
    >>> slow = Func(dumps, loads, File('storage/'))  # doctest: +SKIP
    >>> def weight(k, v):
    ...     return sys.getsizeof(v)
    >>> buff = Buffer(fast, slow, 1e8, weight=weight)  # doctest: +SKIP

    See Also
    --------
    LRU
    c         C   s   d S(   Ni   (    (   t   kt   v(    (    s*   lib/python2.7/site-packages/zict/buffer.pyt   <lambda>&   t    c         C   s‘   t  | | d | d |  j g ƒ|  _ | |  _ | |  _ | |  _ t | ƒ rW | g } n  t | ƒ ro | g } n  | px g  |  _ | p‡ g  |  _ d  S(   Nt   weightt   on_evict(	   R   t   fast_to_slowt   fastt   slowt   nR	   t   callablet   fast_to_slow_callbackst   slow_to_fast_callbacks(   t   selfR   R   R   R	   R   R   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyt   __init__&   s    $			c         C   s2   | |  j  | <x |  j D] } | | | ƒ q Wd  S(   N(   R   R   (   R   t   keyt   valuet   cb(    (    s*   lib/python2.7/site-packages/zict/buffer.pyR   3   s    c         C   sg   |  j  | } |  j | | ƒ |  j k rB |  j  | =| |  j | <n  x |  j D] } | | | ƒ qL W| S(   N(   R   R	   R   R   R   (   R   R   R   R   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyt   slow_to_fast8   s    
c         C   sF   | |  j  k r |  j  | S| |  j k r6 |  j | ƒ St | ƒ ‚ d  S(   N(   R   R   R   t   KeyError(   R   R   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyt   __getitem__B   s
    c         C   sj   |  j  | | ƒ } |  j  | | ƒ |  j k rY | |  j k rI |  j | =n  | |  j | <n | |  j | <d  S(   N(   R	   R   R   R   (   R   R   R   R	   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyt   __setitem__J   s    c         C   sH   | |  j  k r |  j  | =n( | |  j k r8 |  j | =n t | ƒ ‚ d  S(   N(   R   R   R   (   R   R   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyt   __delitem__T   s
    c         C   s   t  |  j j ƒ  |  j j ƒ  ƒ S(   N(   R    R   t   keysR   (   R   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyR   \   s    c         C   s   t  |  j j ƒ  |  j j ƒ  ƒ S(   N(   R    R   t   valuesR   (   R   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyR   _   s    c         C   s   t  |  j j ƒ  |  j j ƒ  ƒ S(   N(   R    R   t   itemsR   (   R   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyR   b   s    c         C   s   t  |  j ƒ t  |  j ƒ S(   N(   t   lenR   R   (   R   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyt   __len__e   s    c         C   s   t  t |  j ƒ t |  j ƒ ƒ S(   N(   R    t   iterR   R   (   R   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyt   __iter__h   s    c         C   s   | |  j  k p | |  j k S(   N(   R   R   (   R   R   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyt   __contains__k   s    c         C   s    d t  |  j ƒ t  |  j ƒ f S(   Ns   Buffer<%s, %s>(   t   strR   R   (   R   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyt   __str__n   s    c         C   s   |  j  j ƒ  |  j j ƒ  d  S(   N(   R   t   flushR   (   R   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyR&   s   s    c         C   s   t  |  j ƒ t  |  j ƒ d  S(   N(   R   R   R   (   R   (    (    s*   lib/python2.7/site-packages/zict/buffer.pyR   w   s    N(   t   __name__t
   __module__t   __doc__t   NoneR   R   R   R   R   R   R   R   R   R    R"   R#   R%   t   __repr__R&   R   (    (    (    s*   lib/python2.7/site-packages/zict/buffer.pyR      s$   		
		
									N(   t	   itertoolsR    t   commonR   R   t   lruR   R   (    (    (    s*   lib/python2.7/site-packages/zict/buffer.pyt   <module>   s   