U
    Û~fhU  ã                   @  s°   U d Z ddlmZ ddlZddlZddlmZ ddlm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZ ee d¡ƒZded< ed	ƒZed
ƒZedƒZG dd„ de
eef ƒZdS )zðTools for creating and manipulating SON, the Serialized Ocument Notation.

Regular dictionaries can be used instead of SON objects, but not when the order
of keys is important. A SON object can be used just like a normal Python
dictionary.
é    )ÚannotationsN)ÚMapping)ÚAnyÚDictÚIterableÚIteratorr   ÚOptionalÚPatternÚTupleÚTypeÚTypeVarÚUnionÚcastÚ zType[Pattern[Any]]ÚRE_TYPEÚ_KeyÚ_ValueÚ_Tc                      sˆ  e Zd ZU dZded< dOddddœd	d
„Zdddddœ‡ fdd„Zddœdd„Zddddœdd„Zdddœdd„Z	ddœdd„Z
ddœdd „Zdd!dœd"d#„Zddœd$d%„Zd&dœd'd(„Zd)dœd*d+„Zddœ‡ fd,d-„Zdddd.œd/d0„Zdd1d1d2œd3d4„Zd5dœd6d7„ZdPd8ddd9œd:d;„ZdQdd<d=d.œd>d?„Zdd!d@œdAdB„Zdd!d@œdCdD„ZdEdœdFdG„ZdHdœdIdJ„ZdKddLœdMdN„Z‡  ZS )RÚSONz¾SON data.

    A subclass of dict that maintains ordering of keys and provides a
    few extra niceties for dealing with SON. SON provides an API
    similar to collections.OrderedDict.
    z	list[Any]Ú
_SON__keysNzEOptional[Union[Mapping[_Key, _Value], Iterable[Tuple[_Key, _Value]]]]r   ÚNone)ÚdataÚkwargsÚreturnc                 K  s(   g | _ t | ¡ |  |¡ |  |¡ d S ©N)r   ÚdictÚ__init__Úupdate)Úselfr   r   © r   ú,/tmp/pip-unpacked-wheel-36gvocj8/bson/son.pyr   <   s    

zSON.__init__zType[SON[_Key, _Value]]zSON[_Key, _Value])ÚclsÚargsr   r   c                   s   t ƒ j| f|ž|Ž}g |_|S r   )ÚsuperÚ__new__r   )r!   r"   r   Úinstance©Ú	__class__r   r    r$   F   s    zSON.__new__Ústr)r   c                 C  s:   g }| j D ] }| d|›d| | ›d¡ q
dd |¡ S )Nú(z, ú)z	SON([%s]))r   ÚappendÚjoin)r   ÚresultÚkeyr   r   r    Ú__repr__K   s    
zSON.__repr__r   r   )r.   Úvaluer   c                 C  s(   || j kr| j  |¡ t | ||¡ d S r   )r   r+   r   Ú__setitem__)r   r.   r0   r   r   r    r1   Q   s    
zSON.__setitem__)r.   r   c                 C  s   | j  |¡ t | |¡ d S r   )r   Úremover   Ú__delitem__©r   r.   r   r   r    r3   V   s    zSON.__delitem__c                 C  s   t ƒ }| | ¡ |S r   )r   r   ©r   Úotherr   r   r    ÚcopyZ   s    
zSON.copyzIterator[_Key]c                 c  s   | j E d H  d S r   ©r   ©r   r   r   r    Ú__iter__b   s    zSON.__iter__Úboolc                 C  s
   || j kS r   r8   r4   r   r   r    Úhas_keye   s    zSON.has_keyc                 C  s   |   ¡ S r   )r:   r9   r   r   r    Úiterkeysh   s    zSON.iterkeyszIterator[_Value]c                 c  s   |   ¡ D ]\}}|V  qd S r   ©Úitems)r   Ú_Úvr   r   r    Ú
itervaluesl   s    zSON.itervalueszlist[_Value]c                 C  s   dd„ |   ¡ D ƒS )Nc                 S  s   g | ]\}}|‘qS r   r   )Ú.0r@   rA   r   r   r    Ú
<listcomp>q   s     zSON.values.<locals>.<listcomp>r>   r9   r   r   r    Úvaluesp   s    z
SON.valuesc                   s   g | _ tƒ  ¡  d S r   )r   r#   Úclearr9   r&   r   r    rF   s   s    z	SON.clear)r.   Údefaultr   c                 C  s,   z
| | W S  t k
r&   || |< Y nX |S r   ©ÚKeyError©r   r.   rG   r   r   r    Ú
setdefaultw   s
    
zSON.setdefaultzUnion[_Value, _T])r.   r"   r   c                 G  sb   t |ƒdkr$tdtdt |ƒ ƒ ƒ‚z| | }W n& tk
rV   |rP|d  Y S ‚ Y nX | |= |S )Né   z&pop expected at most 2 arguments, got r   )ÚlenÚ	TypeErrorÚreprrI   )r   r.   r"   r0   r   r   r    Úpop~   s    zSON.popzTuple[_Key, _Value]c                 C  sF   zt t|  ¡ ƒƒ\}}W n tk
r6   tdƒd ‚Y nX | |= ||fS )Nzcontainer is empty)ÚnextÚiterr?   ÚStopIterationrI   )r   ÚkrA   r   r   r    ÚpopitemŠ   s    zSON.popitemzOptional[Any])r6   r   r   c                 K  sz   |d kr
n^t |dƒr0| ¡ D ]\}}|| |< qn8t |dƒrR|D ]}|| | |< q>n|D ]\}}|| |< qV|rv|  |¡ d S )Nr?   Úkeys)Úhasattrr?   r   )r   r6   r   rT   rA   r   r   r    r   ’   s    


z
SON.updatezOptional[Union[_Value, _T]]zUnion[_Value, _T, None]c                 C  s(   z
| | W S  t k
r"   | Y S X d S r   rH   rJ   r   r   r    Úget¢   s    
zSON.get)r6   r   c                 C  sD   t |tƒr2t| ƒt|ƒko0t|  ¡ ƒt| ¡ ƒkS tt|  ¡ |kƒS )z|Comparison to another SON is order-sensitive while comparison to a
        regular dictionary is order-insensitive.
        )Ú
isinstancer   rM   Úlistr?   r   r;   Úto_dictr5   r   r   r    Ú__eq__ª   s    
(z
SON.__eq__c                 C  s
   | |k S r   r   r5   r   r   r    Ú__ne__²   s    z
SON.__ne__Úintc                 C  s
   t | jƒS r   )rM   r   r9   r   r   r    Ú__len__µ   s    zSON.__len__údict[_Key, _Value]c                   s&   dddœ‡ fdd„‰ t dˆ t| ƒƒƒS )z¡Convert a SON document to a normal Python dictionary instance.

        This is trickier than just *dict(...)* because it needs to be
        recursive.
        r   )r0   r   c                   sD   t | tƒr‡ fdd„| D ƒS t | tƒr<‡ fdd„|  ¡ D ƒS | S d S )Nc                   s   g | ]}ˆ |ƒ‘qS r   r   )rC   rA   ©Útransform_valuer   r    rD   Á   s     z8SON.to_dict.<locals>.transform_value.<locals>.<listcomp>c                   s   i | ]\}}|ˆ |ƒ“qS r   r   )rC   rT   rA   ra   r   r    Ú
<dictcomp>Ã   s      z8SON.to_dict.<locals>.transform_value.<locals>.<dictcomp>)rY   rZ   Ú_Mappingr?   )r0   ra   r   r    rb   ¿   s
    

z$SON.to_dict.<locals>.transform_valuer`   )r   r   r9   r   ra   r    r[   ¸   s    zSON.to_dictzdict[int, SON[_Key, _Value]])Úmemor   c                 C  sZ   t ƒ }t| ƒ}||kr|| S |||< |  ¡ D ]&\}}t|tƒsLt ||¡}|||< q.|S r   )r   Úidr?   rY   r   r7   Údeepcopy)r   re   ÚoutZval_idrT   rA   r   r   r    Ú__deepcopy__É   s    

zSON.__deepcopy__)N)N)N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   r$   r/   r1   r3   r7   r:   r<   r=   rB   rE   rF   rK   rP   rU   r   rX   r\   r]   r_   r[   ri   Ú__classcell__r   r   r&   r    r   2   s4   
 þ
 ÿr   )rm   Ú
__future__r   r7   ÚreÚcollections.abcr   rd   Útypingr   r   r   r   r   r	   r
   r   r   r   r   ÚtypeÚcompiler   rn   r   r   r   r   r   r   r   r    Ú<module>   s   8