o
    n~b                     @   s   d dl Z d dlmZ e jd  dkr9dZeZeZd dl	m
Z G dd dejZG dd dejZG d	d
 d
ejZndZeZeZdd Zdd Zdd ZG dd deZdS )    N)Counter   valuesc                   @      e Zd Zdd ZdS )_kViewc                 C   
   | j  S N)_mappingiterkeysself r   4/usr/local/lib/python3.10/dist-packages/vdf/vdict.py__iter__
      
z_kView.__iter__N__name__
__module____qualname__r   r   r   r   r   r   	       r   c                   @   r   )_vViewc                 C   r   r   )r	   
itervaluesr   r   r   r   r      r   z_vView.__iter__Nr   r   r   r   r   r      r   r   c                   @   r   )_iViewc                 C   r   r   )r	   	iteritemsr   r   r   r   r      r   z_iView.__iter__Nr   r   r   r   r   r      r   r   r   c                 C      t |  S r   )listr
   xr   r   r   <lambda>       r   c                 C   r   r   )r   r   r   r   r   r   r      r   c                 C   r   r   )r   r   r   r   r   r   r      r   c                       s
  e Zd Zd8ddZdd Zdd Zdd	 Zd
d Z fddZ fddZ	 fddZ
dd Z fddZdd Zdd Z fddZ fddZd8ddZd d! Zd"d# Zd8d$d%Zd&d' Zd(d) Zd*d+ Zd,d- Zd.d/ Zd0d1 Zd2d3 Z fd4d5Zd6d7 Z  ZS )9VDFDictNc                 C   sF   g | _ t | _|dur!t|ttfstdt| | | dS dS )a  
        This is a dictionary that supports duplicate keys and preserves insert order

        ``data`` can be a ``dict``, or a sequence of key-value tuples. (e.g. ``[('key', 'value'),..]``)
        The only supported type for key is str.

        Get/set duplicates is done by tuples ``(index, key)``, where index is the duplicate index
        for the specified key. (e.g. ``(0, 'key')``, ``(1, 'key')``...)

        When the ``key`` is ``str``, instead of tuple, set will create a duplicate and get will look up ``(0, key)``
        Nz1Expected data to be list of pairs or dict, got %s)	_VDFDict__omapr   _VDFDict__kcount
isinstancer   dict
ValueErrortypeupdate)r   datar   r   r   __init__   s   zVDFDict.__init__c                 C   s(   d| j j }|dtt|   7 }|S )Nz%s(z%s))	__class__r   reprr   r   )r   outr   r   r   __repr__0   s   zVDFDict.__repr__c                 C   s
   t | jS r   )lenr!   r   r   r   r   __len__5   r   zVDFDict.__len__c                 C   sL   t |dkrtdt | t|d tstdt|d ts$tdd S )N   z)Expected key tuple length to be 2, got %dr   zKey index should be an int   zKey value should be a str)r.   r%   r#   int	TypeError_string_typer   keyr   r   r   _verify_key_tuple8   s   zVDFDict._verify_key_tuplec                 C   s>   t |trd|f}|S t |tr| | |S tdt| )Nr   z)Expected key to be a str or tuple, got %s)r#   r4   tupler7   r3   r&   r5   r   r   r   _normalize_key@   s   


zVDFDict._normalize_keyc                    s   t |tr| j| |f}| j| nt |tr*| | || vr)tdt| nt	dt
t| || | j|d   d7  < d S )Nz%s doesn't existz&Expected either a str or tuple for keyr1   )r#   r4   r"   r!   appendr8   r7   KeyErrorr+   r3   superr    __setitem__r   r6   valuer*   r   r   r=   I   s   


zVDFDict.__setitem__c                       t t| | |S r   )r<   r    __getitem__r9   r5   r@   r   r   rB   V      zVDFDict.__getitem__c           
         s   |  |}tt| |}| j|}| j|= |\}}| j|  d8  < | j| | }|dkrrt|t| jD ]:}| j| d |krq| j| }||f}	tt| 	|	| |  tt| | |	| j|< |d7 }|d8 }|dkrq nq7| j| dkr}| j|= |S )Nr1   r   )
r9   r<   r    __delitem__r!   indexr"   _ranger.   r=   )
r   r6   resultZ	start_idxZdup_idxZskeyZ
tail_countidxZoldkeyZnewkeyr@   r   r   rD   Y   s.   


zVDFDict.__delitem__c                 C   r   r   )iterr
   r   r   r   r   r   w      zVDFDict.__iter__c                    rA   r   )r<   r    __contains__r9   r5   r@   r   r   rK   z   rC   zVDFDict.__contains__c                 C   s&   t |trt|  t| kS dS )NF)r#   r    r   itemsr   otherr   r   r   __eq__}   s   
zVDFDict.__eq__c                 C   s   |  | S r   )rO   rM   r   r   r   __ne__   rJ   zVDFDict.__ne__c                    s$   t t|   | j  t | _d S r   )r<   r    clearr"   r   r!   r   r@   r   r   rQ      s   
zVDFDict.clearc                    s   t t| j| |g|R  S r   )r<   r    getr9   )r   r6   argsr@   r   r   rR      s   zVDFDict.getc                 C   s   || vr
|  || | |S r   )r=   rB   )r   r6   defaultr   r   r   
setdefault   s   
zVDFDict.setdefaultc                 C   s"   |  |}| |}| | |S r   )r9   rB   rD   r>   r   r   r   pop   s   


zVDFDict.popc                 C   s*   | j std| j d }|d | |fS )NzVDFDict is emptyr1   )r!   r;   rV   r5   r   r   r   popitem   s   
zVDFDict.popitemc                 K   sL   t |tr
| }nt |tstdt| |D ]
\}}| || qd S )Nz*Expected data to be a list or dict, got %s)r#   r$   rL   r   r3   r&   r=   )r   r(   kwargsr6   r?   r   r   r   r'      s   


zVDFDict.updatec                 C   s   dd | j D S )Nc                 s   s    | ]}|d  V  qdS r1   Nr   .0r6   r   r   r   	<genexpr>       z#VDFDict.iterkeys.<locals>.<genexpr>r!   r   r   r   r   r
      s   zVDFDict.iterkeysc                 C      t | S r   )r   r   r   r   r   keys      zVDFDict.keysc                        fdd j D S )Nc                 3   s    | ]} | V  qd S r   r   r[   r   r   r   r]      r^   z%VDFDict.itervalues.<locals>.<genexpr>r_   r   r   r   r   r         zVDFDict.itervaluesc                 C   r`   r   )r   r   r   r   r   r      rb   zVDFDict.valuesc                    rc   )Nc                 3   s     | ]}|d   | fV  qdS rZ   r   r[   r   r   r   r]      s    z$VDFDict.iteritems.<locals>.<genexpr>r_   r   r   r   r   r      rd   zVDFDict.iteritemsc                 C   r`   r   )r   r   r   r   r   rL      rb   zVDFDict.itemsc                    s0   t  ts	td fddtj  D S )z% Returns all values of the given key zKey needs to be a string.c                    s   g | ]}| f qS r   r   )r\   rH   r6   r   r   r   
<listcomp>   s    z'VDFDict.get_all_for.<locals>.<listcomp>)r#   r4   r3   rF   r"   r5   r   re   r   get_all_for   s   
zVDFDict.get_all_forc                    s`   t  ts	tdt| j  D ]}tt| | f qtt	 fdd| j
| _
| j = dS )z& Removes all items with the given key zKey need to be a string.c                    s   | d  kS )Nr1   r   r   r6   r   r   r      r   z(VDFDict.remove_all_for.<locals>.<lambda>N)r#   r4   r3   rF   r"   r<   r    rD   r   filterr!   )r   r6   rH   r@   rh   r   remove_all_for   s   
zVDFDict.remove_all_forc                    s6   t | jt D ]	}|dkr dS q fdd  | S )z
        Returns ``True`` if the dict contains keys with duplicates.
        Recurses through any all keys with value that is ``VDFDict``.
        r1   Tc                    sD   t | t D ]}t|tr| r dS t|tr |  S qdS )NTF)getattr_iter_valuesr#   r    has_duplicatesr$   )objvdict_recurser   r   rq      s   
z,VDFDict.has_duplicates.<locals>.dict_recurse)rk   r"   rl   )r   nr   rp   r   rm      s   zVDFDict.has_duplicatesr   )r   r   r   r)   r-   r/   r7   r9   r=   rB   rD   r   rK   rO   rP   rQ   rR   rU   rV   rX   r'   r
   ra   r   r   r   rL   rg   rj   rm   __classcell__r   r   r@   r   r       s8    
	

	r    )syscollectionsr   version_inforl   rangerF   strr4   collections.abcabcZ_cKeysViewr   
ValuesViewr   	ItemsViewr   xrange
basestringr$   r    r   r   r   r   <module>   s"    