U
    ovgJA                     @  s  d dl mZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dlm
Z
 d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ ddlmZ ededZededZededZededZG dd dZG dd dee
eef ZG dd  d eeef ZG d!d" d"ee ZG d#d$ d$Z d,d&d'd(d)d*d+Z!d%S )-    )annotations)filterfalse)AbstractSet)Any)Callable)cast)
Collection)Dict)Iterable)Iterator)List)Mapping)NoReturn)Optional)Set)Tuple)TYPE_CHECKING)TypeVar)Union   )Self_T)bound_S_KT_VTc                   @  sh   e Zd ZdZddddddZddddddZddd	d
dZddddddZddddddZdS )ReadOnlyContainer r   r   argkwreturnc                 O  s   t d| jj d S )Nz&%s object is immutable and/or readonly	TypeError	__class____name__selfr   r    r   r   C/tmp/pip-unpacked-wheel-uqd9otp_/sqlalchemy/util/_py_collections.py	_readonly)   s    
zReadOnlyContainer._readonlyc                 O  s   t d| jj d S )Nz%s object is immutabler"   r&   r   r   r(   
_immutable.   s    zReadOnlyContainer._immutablekeyr!   c                 C  s   |    d S Nr)   r'   r,   r   r   r(   __delitem__1   s    zReadOnlyContainer.__delitem__)r,   valuer!   c                 C  s   |    d S r-   r.   r'   r,   r1   r   r   r(   __setitem__4   s    zReadOnlyContainer.__setitem__strc                 C  s   |    d S r-   r.   r2   r   r   r(   __setattr__7   s    zReadOnlyContainer.__setattr__N)	r%   
__module____qualname__	__slots__r)   r*   r0   r3   r5   r   r   r   r(   r   &   s   r   c                   @  s   e Zd Zer*dddddZddddZddd	d
ddZd	dddZdddd	dddZd	dddZ	dddd	dddZ
ddd	d
ddZdS )ImmutableDictBaser   r   )argsr!   c                 G  s   d S r-   r   clsr:   r   r   r(   __new__>       zImmutableDictBase.__new__r:   c                 G  s   d S r-   r   r;   r   r   r(   __init__@   r>   zImmutableDictBase.__init__r   r   c                 O  s   |    d S r-   )r*   r&   r   r   r(   r)   B   s    zImmutableDictBase._readonlyr!   c                 C  s   |    d S r-   r.   r'   r   r   r(   clearE   s    zImmutableDictBase.clearNzOptional[Any])r,   defaultr!   c                 C  s   |    d S r-   r.   r'   r,   rD   r   r   r(   popH   s    zImmutableDictBase.popc                 C  s   |    d S r-   r.   rB   r   r   r(   popitemK   s    zImmutableDictBase.popitemc                 C  s   |    d S r-   r.   rE   r   r   r(   
setdefaultN   s    zImmutableDictBase.setdefaultc                 O  s   |    d S r-   r.   r&   r   r   r(   updateQ   s    zImmutableDictBase.update)N)N)r%   r6   r7   r   r=   r@   r)   rC   rF   rG   rH   rI   r   r   r   r(   r9   ;   s   r9   c                      s   e Zd Zdd ZddddZdd Zd$d
ddddZd%d
dddddZd
ddddZddddZ	dddddZ
ddd fd d!Zddd fd"d#Z  ZS )&immutabledictc                 G  s   t | }tj|f|  |S r-   )r9   r=   dictr@   )r<   r:   newr   r   r(   r=   V   s    
zimmutabledict.__new__z3Union[Mapping[_KT, _VT], Iterable[Tuple[_KT, _VT]]]r?   c                 G  s   d S r-   r   )r'   r:   r   r   r(   r@   [   s    zimmutabledict.__init__c                 C  s   t t| ffS r-   )rJ   rK   rB   r   r   r(   
__reduce__`   s    zimmutabledict.__reduce__NzOptional[Mapping[_KT, _VT]]zimmutabledict[_KT, _VT])_immutabledict__dr!   c                 C  s0   |s| S t | j}t||  t|| |S r-   r9   r=   r$   rK   r@   rI   )r'   rN   rL   r   r   r(   unionc   s    zimmutabledict.unionr   )rN   r    r!   c                 K  sD   |s|s| S t | j}t||  |r4t|| t|| |S r-   rO   )r'   rN   r    rL   r   r   r(   _union_w_kwn   s    zimmutabledict._union_w_kw)dictsr!   c                 G  sN   d }|D ]4}|r|d kr0t | j}t||  t|| q|d krJ| S |S r-   rO   )r'   rR   rL   dr   r   r(   
merge_with|   s    zimmutabledict.merge_withr4   rA   c                 C  s   dt |  S )Nzimmutabledict(%s))rK   __repr__rB   r   r   r(   rU      s    zimmutabledict.__repr__r   r   )_immutabledict__valuer!   c                 C  s   |    d S r-   r.   r'   rV   r   r   r(   __ior__   s    zimmutabledict.__ior__zMapping[_KT, _VT]c                   s   t t |S r-   )rJ   super__or__rW   r$   r   r(   rZ      s    
zimmutabledict.__or__c                   s   t t |S r-   )rJ   rY   __ror__rW   r[   r   r(   r\      s    
zimmutabledict.__ror__)N)N)r%   r6   r7   r=   r@   rM   rP   rQ   rT   rU   rX   rZ   r\   __classcell__r   r   r[   r(   rJ   U   s     rJ   c                      s  e Zd ZU dZded< dRddd fdd	Zd
dddZddd fddZddd fddZdd fddZ	dddd fddZ
ddd fddZdd fddZddddd Zd!dd"d#Zd!d
d$d%d&Zd'dd(d)ZeZd*dd+ fd,d-Zd.d/d$d0d1Zd2d/d$d3d4Zd.d/d$d5d6Zd7d
d$d8d9Zd:d
d$d;d<Zd*d
d$d=d>Zd.d/d$d?d@Zd7d
d$ fdAdBZdCd
d$dDdEZd7dd$ fdFdGZd:d
d$dHdIZd7dd$ fdJdKZd.d/d$dLdMZd7dd$ fdNdOZ dCd
d$dPdQZ!  Z"S )S
OrderedSet_listList[_T]r`   NzOptional[Iterable[_T]]None)rS   r!   c                   s,   |d k	r"t || _t | j ng | _d S r-   )unique_listr`   rY   rI   )r'   rS   r[   r   r(   r@      s    
zOrderedSet.__init__zOrderedSet[_T]rA   c                 C  s&   |   }| j |_t||j |S r-   )r$   r`   copysetrI   )r'   cpr   r   r(   rd      s    zOrderedSet.copyr   )elementr!   c                   s$   || kr| j | t | d S r-   r`   appendrY   addr'   rg   r[   r   r(   rj      s    zOrderedSet.addc                   s   t  | | j| d S r-   )rY   remover`   rk   r[   r   r(   rl      s    zOrderedSet.removec                   s>   z| j  }W n tk
r,   tdd Y nX t | |S )Npop from an empty set)r`   rF   
IndexErrorKeyErrorrY   rl   r'   r1   r[   r   r(   rF      s    zOrderedSet.popint)posrg   r!   c                   s&   || kr| j || t | d S r-   )r`   insertrY   rj   )r'   rr   rg   r[   r   r(   rs      s    zOrderedSet.insertc                   s$   || kr | j | t | d S r-   )r`   rl   rY   rk   r[   r   r(   discard   s    zOrderedSet.discardc                   s   t    g | _d S r-   )rY   rC   r`   rB   r[   r   r(   rC      s    
zOrderedSet.clearr+   c                 C  s
   | j | S r-   r_   r/   r   r   r(   __getitem__   s    zOrderedSet.__getitem__zIterator[_T]c                 C  s
   t | jS r-   )iterr`   rB   r   r   r(   __iter__   s    zOrderedSet.__iter__otherr!   c                 C  s
   |  |S r-   rP   r'   ry   r   r   r(   __add__   s    zOrderedSet.__add__r4   c                 C  s   d| j j| jf S Nz%s(%r))r$   r%   r`   rB   r   r   r(   rU      s    zOrderedSet.__repr__Iterable[_T])	iterablesr!   c                   s8   |D ].}|D ]$}|| kr| j | t | qqd S r-   rh   )r'   r   iterableer[   r   r(   rI      s
    zOrderedSet.updatezAbstractSet[_S]zOrderedSet[Union[_T, _S]]c                 C  s   |  | | S r-   )rI   r{   r   r   r(   rX      s    
zOrderedSet.__ior__zIterable[_S]c                 G  s   |   }|j|  |S r-   )rd   rI   )r'   ry   resultr   r   r(   rP      s    
zOrderedSet.unionc                 C  s
   |  |S r-   rz   r{   r   r   r(   rZ      s    zOrderedSet.__or__Iterable[Any]c                   s(   t    j|  |  fdd| D S )Nc                 3  s   | ]}| kr|V  qd S r-   r   .0a	other_setr   r(   	<genexpr>   s      z*OrderedSet.intersection.<locals>.<genexpr>)re   rI   r$   r{   r   r   r(   intersection   s    
zOrderedSet.intersectionzAbstractSet[object]c                 C  s
   |  |S r-   )r   r{   r   r   r(   __and__   s    zOrderedSet.__and__c                   sp   t |tr| } n(t |tr,|}t| nt|}t|  fddD }|fdd|D  |S )Nc                 3  s   | ]}| kr|V  qd S r-   r   r   r   r   r(   r     s      z2OrderedSet.symmetric_difference.<locals>.<genexpr>c                 3  s   | ]}| kr|V  qd S r-   r   r   rB   r   r(   r     s      )
isinstancere   r   listr$   rI   )r'   ry   
collectionr   r   )r   r'   r(   symmetric_difference   s    



zOrderedSet.symmetric_differencec                 C  s   t ttttf  | |S r-   )r   r^   r   r   r   r   r{   r   r   r(   __xor__	  s    zOrderedSet.__xor__c                   s&   t  j|  |  fdd| jD S )Nc                 3  s   | ]}| kr|V  qd S r-   r   r   r   r   r(   r     s      z(OrderedSet.difference.<locals>.<genexpr>)rY   
differencer$   r`   r{   r[   r   r(   r     s    zOrderedSet.differencezAbstractSet[Optional[_T]]c                 C  s
   |  |S r-   )r   r{   r   r   r(   __sub__  s    zOrderedSet.__sub__c                   s&   t  j|   fdd jD  _d S )Nc                   s   g | ]}| kr|qS r   r   r   rB   r   r(   
<listcomp>  s      z2OrderedSet.intersection_update.<locals>.<listcomp>)rY   intersection_updater`   r{   r[   rB   r(   r     s    zOrderedSet.intersection_updatec                 C  s   |  | | S r-   )r   r{   r   r   r(   __iand__  s    
zOrderedSet.__iand__c                   sX   t |tr|nt|}t |  fdd jD  _  j fdd|D 7  _d S )Nc                   s   g | ]}| kr|qS r   r   r   rB   r   r(   r      s      z:OrderedSet.symmetric_difference_update.<locals>.<listcomp>c                   s   g | ]}| kr|qS r   r   r   rB   r   r(   r   !  s      )r   r   r   rY   symmetric_difference_updater`   )r'   ry   r   r[   rB   r(   r     s    z&OrderedSet.symmetric_difference_updatec                 C  s    |  | tttttf  | S r-   )r   r   r^   r   r   r   r{   r   r   r(   __ixor__#  s    
zOrderedSet.__ixor__c                   s&   t  j|   fdd jD  _d S )Nc                   s   g | ]}| kr|qS r   r   r   rB   r   r(   r   )  s      z0OrderedSet.difference_update.<locals>.<listcomp>)rY   difference_updater`   r{   r[   rB   r(   r   '  s    zOrderedSet.difference_updatec                 C  s   |  | | S r-   )r   r{   r   r   r(   __isub__+  s    
zOrderedSet.__isub__)N)#r%   r6   r7   r8   __annotations__r@   rd   rj   rl   rF   rs   rt   rC   ru   rw   r|   rU   __str__rI   rX   rP   rZ   r   r   r   r   r   r   r   r   r   r   r   r   r]   r   r   r[   r(   r^      s>   
r^   c                   @  sP  e Zd ZU dZded< d[ddddZd	d
dddZd	ddddZ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dZddd d!d"Zd	ddd#d$Zd	ddd%d&Zddd d'd(Zd	ddd)d*Zd	ddd+d,Zdd d d-d.Zd	d dd/d0Zdd
d d1d2Zd	d dd3d4Zdd d d5d6Zd d dd7d8Zdd
d d9d:Zd d dd;d<Zdd d d=d>Zd d dd?d@Zdd
d dAdBZd d ddCdDZdd d dEdFZ d d ddGdHZ!dd
d dIdJZ"d d ddKdLZ#d ddMdNZ$e$Z%dOddPdQZ&dRddSdTZ'dUddVdWZ(dXddYdZZ)dS )\IdentitySetzA set that considers only object id() for uniqueness.

    This strategy has edge cases for builtin types- it's possible to have
    two 'foo' strings in one of these sets, for example.  Use sparingly.

    zDict[int, Any]_membersNzOptional[Iterable[Any]])r   c                 C  s   t  | _|r| | d S r-   )rK   r   rI   r'   r   r   r   r(   r@   :  s    zIdentitySet.__init__r   rb   )r1   r!   c                 C  s   || j t|< d S r-   r   idrp   r   r   r(   rj   ?  s    zIdentitySet.addboolc                 C  s   t || jkS r-   )r   r   rp   r   r   r(   __contains__B  s    zIdentitySet.__contains__c                 C  s   | j t|= d S r-   r   rp   r   r   r(   rl   E  s    zIdentitySet.removec                 C  s(   z|  | W n tk
r"   Y nX d S r-   )rl   ro   rp   r   r   r(   rt   H  s    zIdentitySet.discardrA   c                 C  s6   z| j  }|d W S  tk
r0   tdY nX d S )N   rm   )r   rG   ro   )r'   pairr   r   r(   rF   N  s
    

zIdentitySet.popc                 C  s   | j   d S r-   )r   rC   rB   r   r   r(   rC   U  s    zIdentitySet.clearrx   c                 C  s   t |tr| j|jkS dS d S )NFr   r   r   r{   r   r   r(   __eq__X  s    
zIdentitySet.__eq__c                 C  s   t |tr| j|jkS dS d S )NTr   r{   r   r   r(   __ne__^  s    
zIdentitySet.__ne__r   )r   r!   c                 C  sV   t || jr|}n
| |}t| t|kr0dS t|jjt| j D ]} dS dS NFTr   r$   lenr   r   r   rv   keysr'   r   ry   mr   r   r(   issubsetd  s    
 zIdentitySet.issubsetc                 C  s   t |tstS | |S r-   )r   r   NotImplementedr   r{   r   r   r(   __le__r  s    
zIdentitySet.__le__c                 C  s(   t |tstS t| t|k o&| |S r-   )r   r   r   r   r   r{   r   r   r(   __lt__w  s    
zIdentitySet.__lt__c                 C  sV   t || jr|}n
| |}t| t|k r0dS t| jjt|j D ]} dS dS r   r   r   r   r   r(   
issuperset|  s    
 zIdentitySet.issupersetc                 C  s   t |tstS | |S r-   )r   r   r   r   r{   r   r   r(   __ge__  s    
zIdentitySet.__ge__c                 C  s(   t |tstS t| t|ko&| |S r-   )r   r   r   r   r   r{   r   r   r(   __gt__  s    
zIdentitySet.__gt__c                 C  s4   |   }| j}|j| |jdd |D  |S )Nc                 s  s   | ]}t ||fV  qd S r-   r   r   objr   r   r(   r     s     z$IdentitySet.union.<locals>.<genexpr>)r$   r   rI   )r'   r   r   membersr   r   r(   rP     s
    zIdentitySet.unionc                 C  s   t |tstS | |S r-   )r   r   r   rP   r{   r   r   r(   rZ     s    
zIdentitySet.__or__c                 C  s   | j dd |D  d S )Nc                 s  s   | ]}t ||fV  qd S r-   r   r   r   r   r(   r     s     z%IdentitySet.update.<locals>.<genexpr>)r   rI   r   r   r   r(   rI     s    zIdentitySet.updatec                 C  s   t |tstS | | | S r-   )r   r   r   rI   r{   r   r   r(   rX     s    

zIdentitySet.__ior__c                   sL   |  | j}t|| jr |j ndd |D   fdd| j D |_|S )Nc                 S  s   h | ]}t |qS r   r   r   r   r   r(   	<setcomp>  s     z)IdentitySet.difference.<locals>.<setcomp>c                   s   i | ]\}}| kr||qS r   r   r   kvry   r   r(   
<dictcomp>  s      z*IdentitySet.difference.<locals>.<dictcomp>r=   r$   r   r   itemsr'   r   r   r   r   r(   r     s    
zIdentitySet.differencec                 C  s   t |tstS | |S r-   )r   r   r   r   r{   r   r   r(   r     s    
zIdentitySet.__sub__c                 C  s   |  |j| _d S r-   )r   r   r   r   r   r(   r     s    zIdentitySet.difference_updatec                 C  s   t |tstS | | | S r-   )r   r   r   r   r{   r   r   r(   r     s    

zIdentitySet.__isub__c                   sL   |  | j}t|| jr |j ndd |D   fdd| j D |_|S )Nc                 S  s   h | ]}t |qS r   r   r   r   r   r(   r     s     z+IdentitySet.intersection.<locals>.<setcomp>c                   s   i | ]\}}| kr||qS r   r   r   r   r   r(   r     s      z,IdentitySet.intersection.<locals>.<dictcomp>r   r   r   r   r(   r     s    
zIdentitySet.intersectionc                 C  s   t |tstS | |S r-   )r   r   r   r   r{   r   r   r(   r     s    
zIdentitySet.__and__c                 C  s   |  |j| _d S r-   )r   r   r   r   r   r(   r     s    zIdentitySet.intersection_updatec                 C  s   t |tstS | | | S r-   )r   r   r   r   r{   r   r   r(   r     s    

zIdentitySet.__iand__c                   sj    j}t|jr |j ndd |D   fddj D |_|jfdd  D  |S )Nc                 S  s   i | ]}t ||qS r   r   r   r   r   r(   r     s      z4IdentitySet.symmetric_difference.<locals>.<dictcomp>c                   s   i | ]\}}| kr||qS r   r   r   r   r   r(   r     s      c                 3  s$   | ]\}}| j kr||fV  qd S r-   )r   r   rB   r   r(   r     s    
 z3IdentitySet.symmetric_difference.<locals>.<genexpr>)r=   r$   r   r   r   rI   r   r   )ry   r'   r(   r     s    
z IdentitySet.symmetric_differencec                 C  s   t |tstS | |S r-   r   r   r   r   r{   r   r   r(   r     s    
zIdentitySet.__xor__c                 C  s   |  |j| _d S r-   )r   r   r   r   r   r(   r     s    z'IdentitySet.symmetric_difference_updatec                 C  s   t |tstS | | | S r-   r   r{   r   r   r(   r     s    

zIdentitySet.__ixor__c                 C  s   |  | j}| j |_|S r-   )r=   r$   r   rd   )r'   r   r   r   r(   rd     s    zIdentitySet.copyrq   c                 C  s
   t | jS r-   )r   r   rB   r   r   r(   __len__  s    zIdentitySet.__len__zIterator[Any]c                 C  s   t | j S r-   )rv   r   valuesrB   r   r   r(   rw     s    zIdentitySet.__iter__r   c                 C  s   t dd S )Nzset objects are unhashable)r#   rB   r   r   r(   __hash__
  s    zIdentitySet.__hash__r4   c                 C  s   dt | jt| j f S r}   )typer%   r   r   r   rB   r   r   r(   rU     s    zIdentitySet.__repr__)N)*r%   r6   r7   __doc__r   r@   rj   r   rl   rt   rF   rC   r   r   r   r   r   r   r   r   rP   rZ   rI   rX   r   r   r   r   r   r   r   r   r   r   r   r   rd   __copy__r   rw   r   rU   r   r   r   r(   r   0  sN   
r   Nr~   zOptional[Callable[[_T], int]]ra   )seqhashfuncr!   c                   s>   t  j s$fdd| D S  fdd| D S d S )Nc                   s    g | ]}| kr|s|qS r   r   r   x)seenseen_addr   r(   r     s       zunique_list.<locals>.<listcomp>c                   s(   g | ] } |kr |s|qS r   r   r   r   r   r   r   r(   r     s    )re   rj   )r   r   r   r   r(   rc     s    rc   )N)"
__future__r   	itertoolsr   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Zutil.typingr   r   r   r   r   r   r9   rJ   r^   r   rc   r   r   r   r(   <module>	   s@   L  c 