U
    Kvf#                     @   sp   zd dl mZ W n ek
r,   dd ZY nX zd dlmZmZmZ W n ek
rZ   Y nX G dd deZ	dS )    )	get_identc                   C   s   dS )Nz<no get_ident> r   r   r   </tmp/pip-unpacked-wheel-68fdvdus/patsy/compat_ordereddict.py
_get_ident   s    r   )KeysView
ValuesView	ItemsViewc                   @   s   e Zd ZdZdd ZejfddZejfddZdd	 Zd
d Z	dd Z
d6d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fdd Zd7d"d#Zi fd$d%Zd&d' Zd(d) Zed8d*d+Zd,d- Zd.d/ Zd0d1 Zd2d3 Z d4d5 Z!d!S )9OrderedDictz)Dictionary that remembers insertion orderc                 O   sn   t |dkrtdt | z
| j W n6 tk
r\   g  | _}||dg|dd< i | _Y n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rootr   r   r   __init__#   s    

zOrderedDict.__init__c                 C   sF   || kr6| 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__3   s
     zOrderedDict.__setitem__c                 C   s0   || | | 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__=   s    
zOrderedDict.__delitem__c                 c   s.   | j }|d }||k	r*|d V  |d }qdS )zod.__iter__() <==> iter(od)r
      Nr   r   r   currr   r   r   __iter__F   s
    
zOrderedDict.__iter__c                 c   s.   | j }|d }||k	r*|d V  |d }qdS )z#od.__reversed__() <==> reversed(od)r   r   Nr   r    r   r   r   __reversed__N   s
    
zOrderedDict.__reversed__c                 C   sd   z@| j  D ]}|dd= q| j}||dg|dd< | j   W n tk
rT   Y nX t|  dS )z.od.clear() -> None.  Remove all items from od.N)r   
itervaluesr   clearr   dict)r   noder   r   r   r   r%   V   s    zOrderedDict.clearTc                 C   s|   | st d| j}|r8|d }|d }||d< ||d< n |d }|d }||d< ||d< |d }| j|= t| |}||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   popitemb   s     
zOrderedDict.popitemc                 C   s   t | S )zod.keys() -> list of keys in od)listr   r   r   r   keys{   s    zOrderedDict.keysc                    s    fdd D S )z#od.values() -> list of values in odc                    s   g | ]} | qS r   r   .0r   r,   r   r   
<listcomp>   s     z&OrderedDict.values.<locals>.<listcomp>r   r,   r   r,   r   values   s    zOrderedDict.valuesc                    s    fdd D S )z.od.items() -> list of (key, value) pairs in odc                    s   g | ]}| | fqS r   r   r.   r,   r   r   r0      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)iterr,   r   r   r   iterkeys   s    zOrderedDict.iterkeysc                 c   s   | D ]}| | V  qdS )z2od.itervalues -> an iterator over the values in odNr   r   kr   r   r   r$      s    zOrderedDict.itervaluesc                 c   s   | D ]}|| | fV  qdS )z=od.iteritems -> an iterator over the (key, value) items in odNr   r5   r   r   r   	iteritems   s    zOrderedDict.iteritemsc                  O   s   t | dkr tdt | f n| s,td| d }d}t | dkrL| d }t|trn|D ]}|| ||< qZn<t|dr| D ]}|| ||< qn|D ]\}}|||< q| D ]\}}|||< qd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
   r-   N)r   r   
isinstancer&   hasattrr-   r2   )r   r   r   otherr   r   r   r   r   update   s(    	


zOrderedDict.updatec                 C   s0   || 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   r=   r   r   r   
setdefault   s    zOrderedDict.setdefaultc                 C   s^   t | t f}||krdS d||< z.| s:d| jjf W S d| jj|  f W S ||= X dS )zod.__repr__() <==> repr(od)z...r
   z%s()z%s(%r)N)idr   	__class____name__r2   )r   Z_repr_runningZcall_keyr   r   r   __repr__   s    zOrderedDict.__repr__c                    sX    fdd D }t   }t t D ]}||d q(|rL j|f|fS  j|ffS )z%Return state information for picklingc                    s   g | ]}| | gqS r   r   )r/   r6   r,   r   r   r0      s     z*OrderedDict.__reduce__.<locals>.<listcomp>N)varscopyr	   r   rA   )r   r2   	inst_dictr6   r   r,   r   
__reduce__   s    zOrderedDict.__reduce__c                 C   s
   |  | S )z!od.copy() -> a shallow copy of od)rA   r,   r   r   r   rE      s    zOrderedDict.copyc                 C   s   |  }|D ]}|||< q
|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   s6   t |tr*t| t|ko(|  | kS t| |S )zod.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
        while comparison to a regular mapping is order-insensitive.

        )r8   r	   r   r2   r&   __eq__r   r:   r   r   r   rL      s    
 zOrderedDict.__eq__c                 C   s
   | |k S )Nr   rM   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)T)N)N)"rB   
__module____qualname____doc__r   r&   r   r   r"   r#   r%   r*   r-   r1   r2   r4   r$   r7   r;   r   objectr<   r   r?   rC   rG   rE   classmethodrK   rL   rN   rO   rP   rQ   r   r   r   r   r	      s:   
	



	r	   N)
threadr   r   ImportError_abcollr   r   r   r&   r	   r   r   r   r   <module>   s   