
    &g(                        % S r SSKJr  SSKrSSKrSSKJr  SSKJ	r	J
r
JrJrJrJrJrJrJrJrJrJr  \" \R*                  " S5      5      rS\S'   \" S	5      r\" S
5      r\" S5      r " S S\
\\4   5      rg)zTools 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                  8  ^  \ rS rSr% SrS\S'    S     SS jjrSU 4S jjrSS jrS S jr	S!S	 jr
S"S
 jrS#S jrS$S jrS#S jrS%S jrS&S jrS'U 4S jjrS(S jrS)S jrS*S jrSS+S jjr S     S,S jjrS-S jrS-S jrS.S jrS/S jrS0S jrSrU =r$ )1SON2   zSON 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__keysc                    / U l         [        R                  U 5        U R                  U5        U R                  U5        g N)r   dict__init__update)selfdatakwargss      MC:\Suresh\moveshuttle\MDcreated\moveengine\venv\Lib\site-packages\bson/son.pyr   SON.__init__<   s/    
 dDF    c                >   > [         TU ]  " U /UQ70 UD6n/ Ul        U$ r   )super__new__r   )clsargsr    instance	__class__s       r!   r&   SON.__new__F   s'    7?3888r#   c                    / nU R                    H  nUR                  SU< SX   < S35        M!     SSR                  U5      -  $ )N(z, )z	SON([%s]))r   appendjoin)r   resultkeys      r!   __repr__SON.__repr__K   sF    ;;CMMAcWBtym156 TYYv...r#   c                    XR                   ;  a  U R                   R                  U5        [        R                  XU5        g r   )r   r/   r   __setitem__)r   r2   values      r!   r6   SON.__setitem__Q   s.    kk!KKs#E*r#   c                d    U R                   R                  U5        [        R                  X5        g r   )r   remover   __delitem__r   r2   s     r!   r;   SON.__delitem__V   s"    3#r#   c                <    [        5       nUR                  U 5        U$ r   )r   r   r   others     r!   copySON.copyZ   s    #&5Tr#   c              #  8   #    U R                    S h  vN   g  N7fr   r   r   s    r!   __iter__SON.__iter__b   s     ;;s   c                    XR                   ;   $ r   rD   r<   s     r!   has_keySON.has_keye   s    kk!!r#   c                "    U R                  5       $ r   )rF   rE   s    r!   iterkeysSON.iterkeysh   s    }}r#   c              #  F   #    U R                  5        H	  u  pUv   M     g 7fr   itemsr   _vs      r!   
itervaluesSON.itervaluesl   s     JJLDAG !s   !c                X    U R                  5        VVs/ s H  u  pUPM	     snn$ s  snnf r   rO   rQ   s      r!   values
SON.valuesp   s"    "jjl+ldal+++s   &c                0   > / U l         [        TU ]	  5         g r   )r   r%   clear)r   r*   s    r!   rZ   	SON.clears   s    r#   c                6     X   $ ! [          a    X U'    U$ f = fr   KeyErrorr   r2   defaults      r!   
setdefaultSON.setdefaultw   s*    	 9 	 I	 s    c           	         [        U5      S:  a#  [        S[        S[        U5      -   5      -   5      e X   nX	 U$ ! [         a    U(       a  US   s $ e f = f)N   z&pop expected at most 2 arguments, got r   )len	TypeErrorreprr^   )r   r2   r(   r7   s       r!   popSON.pop~   sf    t9q=DtAPSTXPYMGZZ[[	IE
 I  	Aw	s   < AAc                     [        [        U R                  5       5      5      u  pX	 X4$ ! [         a    [	        S5      S ef = f)Nzcontainer is empty)nextiterrP   StopIterationr^   )r   krS   s      r!   popitemSON.popitem   sK    	;TZZ\*+DA Gv  	;/0d:	;s	   $+ Ac                    Uc  O_[        US5      (       a  UR                  5        H	  u  p4X@U'   M     O0[        US5      (       a  U H	  nX   X'   M     OU H	  u  p4X@U'   M     U(       a  U R                  U5        g g )NrP   keys)hasattrrP   r   )r   r@   r    rn   rS   s        r!   r   
SON.update   sy    =UG$$Q &UF##(  Q KK r#   c                0     X   $ ! [          a    Us $ f = fr   r]   r_   s      r!   getSON.get   s#    	9 	N	s    c                   [        U[        5      (       aQ  [        U 5      [        U5      :H  =(       a3    [        U R	                  5       5      [        UR	                  5       5      :H  $ [        [        U R                  5       U:H  5      $ )zlComparison to another SON is order-sensitive while comparison to a
regular dictionary is order-insensitive.
)
isinstancer   re   listrP   r   boolto_dictr?   s     r!   __eq__
SON.__eq__   s\     eS!!t9E
*XtDJJL/AT%++-EX/XXD$,,.E122r#   c                    X:X  + $ r    r?   s     r!   __ne__
SON.__ne__   s      r#   c                ,    [        U R                  5      $ r   )re   r   rE   s    r!   __len__SON.__len__   s    4;;r#   c                J   ^ SU4S jjm[        ST" [        U 5      5      5      $ )zConvert a SON document to a normal Python dictionary instance.

This is trickier than just *dict(...)* because it needs to be
recursive.
c                   > [        U [        5      (       a  U  Vs/ s H  nT" U5      PM     sn$ [        U [        5      (       a,  U R                  5        VVs0 s H  u  p!UT" U5      _M     snn$ U $ s  snf s  snnf r   )ry   rz   _MappingrP   )r7   rS   rn   transform_values      r!   r   $SON.to_dict.<locals>.transform_value   sk    %&&49:Eq*E::E8,,:?++-H-$!?1---HH	 ;Hs   A3A8dict[_Key, _Value])r7   r   returnr   )r   r   )r   r   s    @r!   r|   SON.to_dict   s!    	 (/$t**EFFr#   c                    [        5       n[        U 5      nX1;   a  X   $ X!U'   U R                  5        H4  u  pE[        U[        5      (       d  [
        R                  " XQ5      nXRU'   M6     U$ r   )r   idrP   ry   r   rA   deepcopy)r   memooutval_idrn   rS   s         r!   __deepcopy__SON.__deepcopy__   sa    !$D><VJJLDAa))MM!*F ! 
r#   )__keysr   )r   zEOptional[Union[Mapping[_Key, _Value], Iterable[Tuple[_Key, _Value]]]]r    r   r   None)r'   zType[SON[_Key, _Value]]r(   r   r    r   r   SON[_Key, _Value])r   str)r2   r   r7   r   r   r   )r2   r   r   r   )r   r   )r   zIterator[_Key])r2   r   r   r{   )r   zIterator[_Value])r   zlist[_Value])r   r   )r2   r   r`   r   r   r   )r2   r   r(   Union[_Value, _T]r   r   )r   zTuple[_Key, _Value])r@   zOptional[Any]r    r   r   r   )r2   r   r`   zOptional[Union[_Value, _T]]r   zUnion[_Value, _T, None])r@   r   r   r{   )r   int)r   r   )r   zdict[int, SON[_Key, _Value]]r   r   )__name__
__module____qualname____firstlineno____doc____annotations__r   r&   r3   r6   r;   rA   rF   rI   rL   rT   rW   rZ   ra   rh   ro   r   rv   r}   r   r   r|   r   __static_attributes____classcell__)r*   s   @r!   r   r   2   s      W[S  
	
/+
$",
 " AE"=	 3! G"
 
r#   r   )r   
__future__r   rA   recollections.abcr   r   typingr   r   r   r   r	   r
   r   r   r   r   r   typecompiler   r   r   r   r   r   r   r#   r!   <module>r      sy    #  	 /   " #2::b>2	 2v		T]a$tV|
 ar#   