
#R"                 @   s   d  Z  y d d l m Z Wn" e k
 r> d d l m Z Yn Xy  d d l m Z m Z m	 Z	 Wn e k
 rs Yn XGd d   d e
  Z d S)zOrdered dictionary    )	get_ident)KeysView
ValuesView	ItemsViewc               @   sr  e  Z d  Z d Z d d   Z e j d d  Z e j d d  Z d d	   Z d
 d   Z	 d d   Z
 d 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 e   Z e d d   Z d! d" d#  Z i  d$ d%  Z d& d'   Z d( d)   Z e d! d* d+   Z d, d-   Z d. d/   Z d0 d1   Z d2 d3   Z  d4 d5   Z! d! S)6OrderedDictz)Dictionary that remembers insertion orderc             O   s   t  |  d k r( t d t  |    y |  j WnA t k
 rv g  |  _ } | | d g | d d  <i  |  _ Yn X|  j | |   d S)zInitialize an ordered dictionary.  Signature is the same as for
        regular dictionaries, but keyword arguments are not recommended
        because their insertion order is arbitrary.

           z$expected at most 1 arguments, got %dN)len	TypeError_OrderedDict__rootAttributeError_OrderedDict__map_OrderedDict__update)selfargskwdsroot r   0/usr/lib/python3/dist-packages/funcsigs/odict.py__init__   s    zOrderedDict.__init__c             C   sY   | |  k rE |  j  } | d } | | | g | d <| d <|  j | <| |  | |  d S)z!od.__setitem__(i, y) <==> od[i]=yr   r   N)r
   r   )r   keyvalueZdict_setitemr   lastr   r   r   __setitem__.   s
    	
&zOrderedDict.__setitem__c             C   s@   | |  |  |  j  j |  \ } } } | | d <| | d <d S)z od.__delitem__(y) <==> del od[y]r   r   N)r   pop)r   r   Zdict_delitem	link_prev	link_nextr   r   r   __delitem__8   s    
zOrderedDict.__delitem__c             c   s=   |  j  } | d } x# | | k	 r8 | d V| d } q Wd S)zod.__iter__() <==> iter(od)r      N)r
   )r   r   currr   r   r   __iter__A   s
    	
	zOrderedDict.__iter__c             c   s=   |  j  } | d } x# | | k	 r8 | d V| d } q Wd S)z#od.__reversed__() <==> reversed(od)r   r   N)r
   )r   r   r   r   r   r   __reversed__I   s
    	
	zOrderedDict.__reversed__c             C   s   yZ x$ |  j  j   D] } | d d  =q W|  j } | | d g | d d  <|  j  j   Wn t k
 rn Yn Xt j |   d S)z.od.clear() -> None.  Remove all items from od.N)r   
itervaluesr
   clearr   dict)r   Znoder   r   r   r   r"   Q   s    	zOrderedDict.clearTc             C   s   |  s t  d   |  j } | rL | d } | d } | | d <| | d <n( | d } | d } | | d <| | d <| d } |  j | =t j |  |  } | | f S)zod.popitem() -> (k, v), return and remove a (key, value) pair.
        Pairs are returned in LIFO order if last is true or FIFO order if false.

        zdictionary is emptyr   r   r   )KeyErrorr
   r   r#   r   )r   r   r   linkr   r   r   r   r   r   r   popitem]   s     	








zOrderedDict.popitemc             C   s
   t  |   S)zod.keys() -> list of keys in od)list)r   r   r   r   keysv   s    zOrderedDict.keysc                s     f d d     D S)z#od.values() -> list of values in odc                s   g  |  ] }   |  q Sr   r   ).0r   )r   r   r   
<listcomp>|   s   	 z&OrderedDict.values.<locals>.<listcomp>r   )r   r   )r   r   valuesz   s    zOrderedDict.valuesc                s     f d d     D S)z.od.items() -> list of (key, value) pairs in odc                s    g  |  ] } |   | f  q Sr   r   )r)   r   )r   r   r   r*      s   	 z%OrderedDict.items.<locals>.<listcomp>r   )r   r   )r   r   items~   s    zOrderedDict.itemsc             C   s
   t  |   S)z0od.iterkeys() -> an iterator over the keys in od)iter)r   r   r   r   iterkeys   s    zOrderedDict.iterkeysc             c   s   x |  D] } |  | Vq Wd S)z2od.itervalues -> an iterator over the values in odNr   )r   kr   r   r   r!      s    zOrderedDict.itervaluesc             c   s$   x |  D] } | |  | f Vq Wd S)z=od.iteritems -> an iterator over the (key, value) items in odNr   )r   r/   r   r   r   	iteritems   s    zOrderedDict.iteritemsc              O   s   t  |   d k r. t d t  |   f   n |  s@ t d   |  d } f  } t  |   d k rl |  d } t | t  r xw | D] } | | | | <q WnX t | d  r xF | j   D] } | | | | <q Wn! x | D] \ } } | | | <q Wx$ | j   D] \ } } | | | <qWd S)a  od.update(E, **F) -> None.  Update od from dict/iterable E and F.

        If E is a dict instance, does:           for k in E: od[k] = E[k]
        If E has a .keys() method, does:         for k in E.keys(): od[k] = E[k]
        Or if E is an iterable of items, does:   for k, v in E: od[k] = v
        In either case, this is followed by:     for k, v in F.items(): od[k] = v

        r   z8update() takes at most 2 positional arguments (%d given)z,update() takes at least 1 argument (0 given)r   r   r(   N)r   r	   
isinstancer#   hasattrr(   r,   )r   r   r   otherr   r   r   r   r   update   s&    	

zOrderedDict.updatec             C   s@   | |  k r! |  | } |  | =| S| |  j  k r< t |   | S)zod.pop(k[,d]) -> v, remove specified key and return the corresponding value.
        If key is not found, d is returned if given, otherwise KeyError is raised.

        )_OrderedDict__markerr$   )r   r   defaultresultr   r   r   r      s    
zOrderedDict.popNc             C   s"   | |  k r |  | S| |  | <| S)zDod.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in odr   )r   r   r6   r   r   r   
setdefault   s    
zOrderedDict.setdefaultc             C   ss   t  |   t   f } | | k r% d Sd | | <z5 |  sI d |  j j f Sd |  j j |  j   f SWd | | =Xd S)zod.__repr__() <==> repr(od)z...r   z%s()z%s(%r)N)id
_get_ident	__class____name__r,   )r   Z_repr_runningZcall_keyr   r   r   __repr__   s    
zOrderedDict.__repr__c                s~     f d d     D } t     j   } x' t  t    D] } | j | d  q; W| rn   j | f | f S  j | f f S)z%Return state information for picklingc                s    g  |  ] } |   | g  q Sr   r   )r)   r/   )r   r   r   r*      s   	 z*OrderedDict.__reduce__.<locals>.<listcomp>N)varscopyr   r   r;   )r   r,   Z	inst_dictr/   r   )r   r   
__reduce__   s    zOrderedDict.__reduce__c             C   s   |  j  |   S)z!od.copy() -> a shallow copy of od)r;   )r   r   r   r   r?      s    zOrderedDict.copyc             C   s(   |    } x | D] } | | | <q W| S)zOD.fromkeys(S[, v]) -> New ordered dictionary with keys from S
        and values equal to v (which defaults to None).

        r   )clsiterabler   dr   r   r   r   fromkeys   s    	zOrderedDict.fromkeysc             C   sM   t  | t  r= t |   t |  k o< |  j   | j   k St j |  |  S)zod.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
        while comparison to a regular mapping is order-insensitive.

        )r1   r   r   r,   r#   __eq__)r   r3   r   r   r   rE      s    .zOrderedDict.__eq__c             C   s   |  | k S)Nr   )r   r3   r   r   r   __ne__   s    zOrderedDict.__ne__c             C   s
   t  |   S)z@od.viewkeys() -> a set-like object providing a view on od's keys)r   )r   r   r   r   viewkeys   s    zOrderedDict.viewkeysc             C   s
   t  |   S)z<od.viewvalues() -> an object providing a view on od's values)r   )r   r   r   r   
viewvalues   s    zOrderedDict.viewvaluesc             C   s
   t  |   S)zBod.viewitems() -> a set-like object providing a view on od's items)r   )r   r   r   r   	viewitems  s    zOrderedDict.viewitems)"r<   
__module____qualname____doc__r   r#   r   r   r   r    r"   r&   r(   r+   r,   r.   r!   r0   r4   r   objectr5   r   r8   r=   r@   r?   classmethodrD   rE   rF   rG   rH   rI   r   r   r   r   r      s:   
		

	r   N)rL   Zthreadr   r:   ImportErrorZdummy_threadZ_abcollr   r   r   r#   r   r   r   r   r   <module>   s    