B
    €k[H  ã               @   sl   d dl mZmZ d dlmZ G dd„ deƒZdd„ Zdd„ Zd	d
„ Z	dd„ Z
dd„ Zefdd„Zdd„ ZdS )é   )Ú	_toposortÚgroupby)Ú
isvariadicc               @   s   e Zd ZdS )ÚAmbiguityWarningN)Ú__name__Ú
__module__Ú__qualname__© r	   r	   ú8lib/python3.7/site-packages/multipledispatch/conflict.pyr      s   r   c             C   sF  t | ƒt |ƒk r.|  o,t |ƒdko,t|d ƒS t | ƒt |ƒkrNttt| |ƒƒS d}d}xÌ|t | ƒk r"|t |ƒk r"| | }|| }t|ƒs´t|ƒs´t||ƒs¢dS |d7 }|d7 }qXt|ƒrê|t | ƒd ksÐt‚|t |ƒd koèt||ƒS t|ƒrX|t |ƒd kst‚t||ƒsdS |d7 }qXW |t |ƒd ko@|t | ƒkS dS )z3 A is consistent and strictly more specific than B r   éÿÿÿÿé    FN)Úlenr   ÚallÚmapÚ
issubclassÚAssertionError)ÚaÚbÚp1Úp2Úcur_aÚcur_br	   r	   r
   Ú
supercedes	   s.    

r   c             C   s  | s| pt |d ƒS |s,|  p*t | d ƒS t| ƒt|ƒkrTtdd„ t| |ƒD ƒƒS d}d}xˆ|t| ƒk rä|t|ƒk rä| | }|| }t||ƒsžt||ƒsždS t |ƒsÀt |ƒsÀ|d7 }|d7 }q^t |ƒrÒ|d7 }q^t |ƒr^|d7 }q^W t |ƒrü|t|ƒkpt |ƒo|t| ƒkS dS )z= It is possible for an argument list to satisfy both A and B r   c             s   s&   | ]\}}t ||ƒpt ||ƒV  qd S )N)r   )Ú.0ZaaZbbr	   r	   r
   ú	<genexpr>2   s   zconsistent.<locals>.<genexpr>Fr   N)r   r   r   Úzipr   )r   r   r   r   r   r   r	   r	   r
   Ú
consistent'   s.    

r   c             C   s    t | |ƒot| |ƒpt|| ƒ S )z> A is consistent with B but neither is strictly more specific )r   r   )r   r   r	   r	   r
   Ú	ambiguousI   s    r   c                s$   t ttˆ ƒƒ‰ t‡ fdd„ˆ D ƒƒS )z5 All signature pairs such that A is ambiguous with B c             3   sR   | ]J‰ ˆD ]@‰t ˆ ƒt ˆƒk r
tˆ ˆƒr
t‡ ‡fd d„ˆD ƒƒs
ˆ ˆfV  q
qdS )c             3   s"   | ]}t |ˆ ƒot |ˆƒV  qd S )N)r   )r   Úc)r   r   r	   r
   r   T   s   z(ambiguities.<locals>.<genexpr>.<genexpr>N)Úhashr   Úany)r   )Ú
signatures)r   r   r
   r   Q   s
    

zambiguities.<locals>.<genexpr>)Úlistr   ÚtupleÚset)r!   r	   )r!   r
   ÚambiguitiesN   s    r%   c                s<   t ˆd ƒ‰ t‡ fdd„ˆD ƒƒs&t‚‡fdd„tˆ ƒD ƒS )z* A signature that would break ambiguities r   c             3   s   | ]}t |ƒˆ kV  qd S )N)r   )r   Ús)Únr	   r
   r   [   s    z"super_signature.<locals>.<genexpr>c                s*   g | ]"‰ t ‡ fd d„ˆD ƒtdd ‘qS )c                s   g | ]}t  |ˆ  ¡‘qS r	   )ÚtypeÚmro)r   Zsig)Úir	   r
   ú
<listcomp>]   s    z.super_signature.<locals>.<listcomp>.<listcomp>)Úkeyr   )Úmaxr   )r   )r!   )r*   r
   r+   ]   s   z#super_signature.<locals>.<listcomp>)r   r   r   Úrange)r!   r	   )r'   r!   r
   Úsuper_signatureX   s    
r/   c             C   s&   t | |ƒo$t || ƒ p$|| ƒ||ƒkS )zW A should be checked before B

    Tie broken by tie_breaker, defaults to ``hash``
    )r   )r   r   Ztie_breakerr	   r	   r
   Úedgea   s    
r0   c                sj   t ttˆ ƒƒ‰ ‡ fdd„ˆ D ƒ}tdd„ |ƒ}xˆ D ]}||kr4g ||< q4W tdd„ | ¡ D ƒƒ}t|ƒS )zƒ A sane ordering of signatures to check, first to last

    Topoological sort of edges as given by ``edge`` and ``supercedes``
    c                s(   g | ] }ˆ D ]}t ||ƒr||f‘qqS r	   )r0   )r   r   r   )r!   r	   r
   r+   s   s    zordering.<locals>.<listcomp>c             S   s   | d S )Nr   r	   )Úxr	   r	   r
   Ú<lambda>t   s    zordering.<locals>.<lambda>c             s   s$   | ]\}}|d d„ |D ƒfV  qdS )c             S   s   g | ]\}}|‘qS r	   r	   )r   r   r   r	   r	   r
   r+   x   s    z&ordering.<locals>.<genexpr>.<listcomp>Nr	   )r   ÚkÚvr	   r	   r
   r   x   s    zordering.<locals>.<genexpr>)r"   r   r#   r   ÚdictÚitemsr   )r!   Zedgesr&   r	   )r!   r
   Úorderingm   s    
r7   N)Zutilsr   r   Zvariadicr   ÚWarningr   r   r   r   r%   r/   r   r0   r7   r	   r	   r	   r
   Ú<module>   s   "
	