a
    %g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	   úi/mounts/lovelace/software/anaconda3/envs/metaDMG/lib/python3.9/site-packages/multipledispatch/conflict.pyr      s   r   c                 C   sB  t | ƒt |ƒk r.|  o,t |ƒdko,t|d ƒS t | ƒt |ƒkrNttt| |ƒƒS d}d}|t | ƒk r |t |ƒk r | | }|| }t|ƒs²t|ƒs²t||ƒs dS |d7 }|d7 }qVt|ƒrè|t | ƒd ksÎJ ‚|t |ƒd koæt||ƒS t|ƒrV|t |ƒd ksJ ‚t||ƒsdS |d7 }qV|t |ƒd ko<|t | ƒkS dS )z1A is consistent and strictly more specific than Br   éÿÿÿÿé    FN)Úlenr   ÚallÚmapÚ
issubclass©ÚaÚbÚp1Zp2Zcur_aZ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}|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\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 Br   c                 s   s&   | ]\}}t ||ƒpt ||ƒV  qd S ©N)r   )Ú.0ZaaZbbr	   r	   r
   Ú	<genexpr>2   ó    zconsistent.<locals>.<genexpr>Fr   N)r   r   r   Úzipr   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
   Ú	ambiguousG   s    r   c                    s$   t ttˆ ƒƒ‰ t‡ fdd„ˆ D ƒƒS )z3All signature pairs such that A is ambiguous with Bc                 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 r   ©r   )r   Úcr   r	   r
   r   U   r   z(ambiguities.<locals>.<genexpr>.<genexpr>N)Úhashr   Úany©r   ©Ú
signaturesr   r
   r   O   s   
ûzambiguities.<locals>.<genexpr>)Úlistr   ÚtupleÚsetr#   r	   r#   r
   ÚambiguitiesL   s    þr(   c                    s<   t ˆd ƒ‰ t‡ fdd„ˆD ƒƒs&J ‚‡fdd„tˆ ƒD ƒS )z(A signature that would break ambiguitiesr   c                 3   s   | ]}t |ƒˆ kV  qd S r   )r   )r   Ús)Únr	   r
   r   \   r   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   Úsig©Úir	   r
   Ú
<listcomp>^   r   z.super_signature.<locals>.<listcomp>.<listcomp>)Úkeyr   )Úmaxr   r"   r#   r.   r
   r0   ^   r   z#super_signature.<locals>.<listcomp>)r   r   Úranger#   r	   )r*   r$   r
   Úsuper_signatureY   s    r4   c                 C   s&   t | |ƒo$t || ƒ p$|| ƒ||ƒkS )zVA should be checked before B

    Tie broken by tie_breaker, defaults to ``hash``
    r   )r   r   Ztie_breakerr	   r	   r
   Úedgea   s    
ÿr5   c                    sf   t ttˆ ƒƒ‰ ‡ fdd„ˆ D ƒ}tdd„ |ƒ}ˆ D ]}||vr2g ||< q2t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	   )r5   ©r   r   r   r#   r	   r
   r0   s   r   zordering.<locals>.<listcomp>c                 S   s   | d S )Nr   r	   )Úxr	   r	   r
   Ú<lambda>t   r   zordering.<locals>.<lambda>c                 s   s$   | ]\}}|d d„ |D ƒfV  qdS )c                 S   s   g | ]\}}|‘qS r	   r	   r6   r	   r	   r
   r0   x   r   z&ordering.<locals>.<genexpr>.<listcomp>Nr	   )r   ÚkÚvr	   r	   r
   r   x   r   zordering.<locals>.<genexpr>)r%   r   r&   r   ÚdictÚitemsr   )r$   Úedgesr)   r	   r#   r
   Úorderingm   s    
r>   N)Úutilsr   r   Zvariadicr   ÚWarningr   r   r   r   r(   r4   r    r5   r>   r	   r	   r	   r
   Ú<module>   s    