ó
€k[c           @   s‚   d  d l  m Z m Z d  d l m Z d e f d „  ƒ  YZ d „  Z d „  Z d „  Z	 d „  Z
 d	 „  Z e d
 „ Z d „  Z d S(   i   (   t	   _toposortt   groupby(   t
   isvariadict   AmbiguityWarningc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s8   lib/python2.7/site-packages/multipledispatch/conflict.pyR      s   c         C   s·  t  |  ƒ t  | ƒ k  r? |  o> t  | ƒ d k o> t | d ƒ St  |  ƒ t  | ƒ k rm t t t |  | ƒ ƒ Sd } d } x| t  |  ƒ k  rŒ| t  | ƒ k  rŒ|  | } | | } t | ƒ pÉ t | ƒ sö t | | ƒ sß t S| d 7} | d 7} q| t | ƒ rA| t  |  ƒ d k st ‚ | t  | ƒ d k o@t | | ƒ St | ƒ r| | t  | ƒ d k sit ‚ t | | ƒ s|t S| d 7} q| q| W| t  | ƒ d k o²| t  |  ƒ k Sd S(   s3    A is consistent and strictly more specific than B i   iÿÿÿÿi    N(   t   lenR   t   allt   mapt
   issubclasst   Falset   AssertionError(   t   at   bt   p1t   p2t   cur_at   cur_b(    (    s8   lib/python2.7/site-packages/multipledispatch/conflict.pyt
   supercedes	   s.    ''


#c         C   sy  |  s | p t  | d ƒ S| s6 |  p5 t  |  d ƒ St |  ƒ t | ƒ k rk t d „  t |  | ƒ Dƒ ƒ Sd } d } xÁ | t |  ƒ k  r:| t | ƒ k  r:|  | } | | } t | | ƒ rÖ t | | ƒ rÖ t St  | ƒ pë t  | ƒ s| d 7} | d 7} qz t  | ƒ r| d 7} qz t  | ƒ rz | d 7} qz qz Wt  | ƒ rY| t | ƒ k ptt  | ƒ ot| t |  ƒ k Sd S(   s=    It is possible for an argument list to satisfy both A and B i    c         s   s3   |  ]) \ } } t  | | ƒ p* t  | | ƒ Vq d  S(   N(   R	   (   t   .0t   aat   bb(    (    s8   lib/python2.7/site-packages/multipledispatch/conflict.pys	   <genexpr>2   s   i   N(   R   R   R   t   zipR	   R
   (   R   R   R   R   R   R   (    (    s8   lib/python2.7/site-packages/multipledispatch/conflict.pyt
   consistent'   s.    	'

 
c         C   s,   t  |  | ƒ o+ t |  | ƒ p* t | |  ƒ S(   s>    A is consistent with B but neither is strictly more specific (   R   R   (   R   R   (    (    s8   lib/python2.7/site-packages/multipledispatch/conflict.pyt	   ambiguousI   s    c            s/   t  t t ˆ  ƒ ƒ ‰  t ‡  f d †  ˆ  Dƒ ƒ S(   s5    All signature pairs such that A is ambiguous with B c         3   so   |  ]e ‰  ˆ D]X ‰ t  ˆ  ƒ t  ˆ ƒ k  r t ˆ  ˆ ƒ r t ‡  ‡ f d  †  ˆ Dƒ ƒ r ˆ  ˆ f Vq q d S(   c         3   s-   |  ]# } t  | ˆ  ƒ o$ t  | ˆ ƒ Vq d  S(   N(   R   (   R   t   c(   R   R   (    s8   lib/python2.7/site-packages/multipledispatch/conflict.pys	   <genexpr>T   s   N(   t   hashR   t   any(   R   (   t
   signatures(   R   R   s8   lib/python2.7/site-packages/multipledispatch/conflict.pys	   <genexpr>Q   s
    (   t   listR   t   tuplet   set(   R   (    (   R   s8   lib/python2.7/site-packages/multipledispatch/conflict.pyt   ambiguitiesN   s    c            s   t  |  d ƒ ‰  t ‡  f d †  |  Dƒ ƒ s2 t ‚ g  t ˆ  ƒ D]< } t g  |  D] } t j | | ƒ ^ qO d t  ƒd ^ q? S(   s*    A signature that would break ambiguities i    c         3   s!   |  ] } t  | ƒ ˆ  k Vq d  S(   N(   R   (   R   t   s(   t   n(    s8   lib/python2.7/site-packages/multipledispatch/conflict.pys	   <genexpr>[   s    t   key(   R   R   R   t   ranget   maxt   typet   mro(   R   t   it   sig(    (   R"   s8   lib/python2.7/site-packages/multipledispatch/conflict.pyt   super_signatureX   s    "c         C   s5   t  |  | ƒ o4 t  | |  ƒ p4 | |  ƒ | | ƒ k S(   sW    A should be checked before B

    Tie broken by tie_breaker, defaults to ``hash``
    (   R   (   R   R   t   tie_breaker(    (    s8   lib/python2.7/site-packages/multipledispatch/conflict.pyt   edgea   s    c         C   s²   t  t t |  ƒ ƒ }  g  |  D]. } |  D]! } t | | ƒ r& | | f ^ q& q } t d „  | ƒ } x' |  D] } | | k ri g  | | <qi qi Wt d „  | j ƒ  Dƒ ƒ } t | ƒ S(   sƒ    A sane ordering of signatures to check, first to last

    Topoological sort of edges as given by ``edge`` and ``supercedes``
    c         S   s   |  d S(   Ni    (    (   t   x(    (    s8   lib/python2.7/site-packages/multipledispatch/conflict.pyt   <lambda>t   s    c         s   s:   |  ]0 \ } } | g  | D] \ } } | ^ q f Vq d  S(   N(    (   R   t   kt   vR   R   (    (    s8   lib/python2.7/site-packages/multipledispatch/conflict.pys	   <genexpr>x   s    (   R   R   R   R,   R   t   dictt   itemsR    (   R   R   R   t   edgesR!   (    (    s8   lib/python2.7/site-packages/multipledispatch/conflict.pyt   orderingm   s    ;N(   t   utilsR    R   t   variadicR   t   WarningR   R   R   R   R    R*   R   R,   R4   (    (    (    s8   lib/python2.7/site-packages/multipledispatch/conflict.pyt   <module>   s   		"		
		