
    kj>L              
       ,   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlZd dl	m
Z
mZmZmZ d dlmZmZmZmZmZmZmZ  G d de      Zd ZdefdZdefd	Zd
 Z G d de j:                        Z G d de j:                        Zej@                  jC                  ed        de"de#fdZ$ G d de      Z% ede
def         Z& G d de'      Z( ed      Z) G d de(e'ee"df   e
de)f   f         Z*de"de
fdZ+ G d de'      Z G d  d!e"      Z,y)"    N)CallableIterableIteratorMapping)AnyLiteralOptionalTypeVarUnionget_type_hintsoverloadc                       e Zd Zy)DispatchErrorN)__name__
__module____qualname__     A/DATA/.local/lib/python3.12/site-packages/multimethod/__init__.pyr   r      s    r   r   c                 d    t        | t              r| j                  S t        j                  |       S N)
isinstancesubtype
__origin__typing
get_origintps    r   r   r      s%    &r732==N9J9J29NNr   returnc                     t        | t              st        j                  |       t        u rt        | dd      S t        j                  |       S )N__args__r   )r   r   r   r   r   getattrget_argsr   s    r   r#   r#      s<    "g&"3"3B"78"Cr:r**??2r   c                 l    t        | t              rt        j                  |       S | j                         S r   )r   typemroclss    r   get_mror)      s$    &sD1488C=@swwy@r   c                       t        j                          D ]#  }j                  d t        |      D               % t	         fdD              S )Nc              3   h   K   | ]*  }t        t        j                  t        |            s'| , y wr   )
issubclassabcABCMetar%   ).0r(   s     r   	<genexpr>zcommon_bases.<locals>.<genexpr>#   s#     Y]cjdSVi6Xc]s   (22c              3   F   K   | ]  }|   t              k(  s|  y wr   )len)r/   r(   basescountss     r   r0   zcommon_bases.<locals>.<genexpr>$   s!     D&+U*Cs   !!)collectionsCounterupdater)   tuple)r3   baser4   s   ` @r   common_basesr:       sB      "FYWT]YY DDDDr   c                       e Zd ZU dZeed<   eed<   d Zd ZdefdZ	de
fdZdefd	Zd
 Zd Zej"                  dee   fd       Zy)r   zA normalized generic type which checks subscripts.

    Transforms a generic alias into a concrete type which supports `issubclass` and `isinstance`.
    If the type ends up being equivalent to a builtin, the builtin is returned.
    r   r!   c           	         |t         u rt        S t        |d      r | |j                  g| S t        t        d      r-t        |t        j                        r | |j                  g| S t        |t              r,|j                  r | t        |j                     g| S t        S t        |t        j                        r | |j                  g| S t        |      xs |}t        t        d      r t        |t        j                        rt        }t!        t#        | t%        |      xs |            }t'        |      t        hk  r|t         u r|s|S t)        |      t(        t*        j,                  fv r|fnd}|t.        u r' | t        t!        t#        t(        |                     f}|t        u rt1        | d d }|d   |v r|d   S |t2        u r|d d dk(  r|dd  }||d}t(        j5                  | t7        |      ||      S )	N__supertype__TypeAliasType	UnionTyper      r   .r   r!   )r   objecthasattrr=   r   r   r>   	__value__r
   __constraints__r   _AnnotatedAliasr   r   typesr?   r8   mapr#   setr%   r-   r.   r   r:   r   __new__str)r(   r   argsoriginr3   	namespaces         r   rK   zsubtype.__new__1   s   9M2'r''/$//6?+
2v?S?S0Tr||+d++b'"<><N<N3uR//0848ZTZZb&001r}},t,,B%25+&:b%//+JFShrl2d34t9 &E/dM!&\dCKK-@@	bWuSt_5679EU? $'+EQx4QxX$r(f"48D#)t<	||CR%;;r   c                      y r   r   )selfr   rM   s      r   __init__zsubtype.__init__N   s    3r   r   c                 6    | j                   g| j                  S r   rB   rQ   s    r   keyzsubtype.keyP   s    ...r   c                 j    t        |d      xr& | j                         t        j                  |      k(  S Nr   )rD   rU   r   rQ   others     r   __eq__zsubtype.__eq__S   s(    ul+P
gkk%>P0PPr   c                 4    t        | j                               S r   )hashrU   rT   s    r   __hash__zsubtype.__hash__V   s    DHHJr   c                     t        |      xs |}t        |      }|t        u rt         fd|D              S |t        u rt         fd|D              S  j
                  t        u ry j
                  t        u rt        | j                        S  j
                  t        u rZ|t        u xrP t         j                  dd        t        |dd        k  xr' t        |d d       t         j                  d d       k  S t        |      t         j                        k(  xr> t        | j
                        xr& t        d t        | j                        D              S )Nc              3   6   K   | ]  }t        |        y wr   r   )r/   argrQ   s     r   r0   z,subtype.__subclasscheck__.<locals>.<genexpr>]        =z#t,   c              3   6   K   | ]  }t        |        y wr   r,   )r/   r(   rQ   s     r   r0   z,subtype.__subclasscheck__.<locals>.<genexpr>_   rb   rc   Fc              3   D   K   | ]  }|d    |d   u xs t        |   yw)r   r@   Nre   )r/   pairs     r   r0   z,subtype.__subclasscheck__.<locals>.<genexpr>m   s-     aH`DGtAw&;*d*;;H`s    )r   r#   r   allr   r   r,   r!   r   	signaturer2   zip)rQ   subclassrN   rM   s   `   r   __subclasscheck__zsubtype.__subclasscheck__Y   s6   H%1!W====U?====??g%??e#h66??h&(" JdmmBC01YtBCy5IIJd3Bi(IdmmCR6H,II IT]]++ b64??3baDRVR_R_H`aa	
r   c                    | j                   t        u rt        fd| j                  D              S | j                   t        u rt        | j                        S t        d      rt        j                  |       S | j                   t        u r-t        j                        xr t        | j                        S t        | j                         rt        t              ry| j                   t        u r1t        t        t        gt              j!                          |       S | j                   t"        u r4| j                  dd  dk7  r"t%              t%        | j                        k7  rKyt        | t&              r$t)        t+        j-                               d      nt/        j0                  d      t3        t5        t
        | j                              S )Nc              3   Z   K   | ]"  }t        |      t              k(  xr |k(   $ y wr   )r%   )r/   ra   instances     r   r0   z,subtype.__instancecheck__.<locals>.<genexpr>r   s-     `R_3tCyDN2FshFR_s   (+__orig_class__Frf   rA   r   r@   )r   r   anyr!   r   r   rD   r,   rq   r%   inspectisclassr   r   r   r   valuesr8   r2   r   nextiteritems	itertoolsisliceri   rI   )rQ   rp   s    `r   __instancecheck__zsubtype.__instancecheck__p   s[   ??g%`RVR_R_```??e#h668-.h55t<<??d"??8,THdmm1TT(DOO4
8X8V??h&ghS1I1P1P1RSUYZZ??e#bc(:f(D8}DMM 22g&D!12B7H ''!4H3z8T]];<<r   c              #     K   t        |       }|t        u r,t        t        t        | j
                              E d{    y|t        u r/| j
                  D ]  }t        j                  |      E d{    ! y|| yy7 D7 w)zReturn origin types which would require instance checks.

        Provisional custom usage: `subtype.origins.register(<metaclass>, lambda cls: ...)
        N)	r   r   rJ   rI   r%   r!   r   r   origins)rQ   rN   ra   s      r   r}   zsubtype.origins   su      D!W3tT]]3444u_}}"??3/// %L  	 5 0s!   :BB4B1B2BBN)r   r   r   __doc__r%   __annotations__r8   rK   rR   rU   boolrZ   intr]   rm   r{   	functoolssingledispatchr   r}   r   r   r   r   r   '   ss     O<: '/U /Qt Q #  
.=, $  r   r   c                   D     e Zd ZdZdedef fdZd Zd Zd Z	d Z
 xZS )	
parametriczA type which further customizes `issubclass` and `isinstance` beyond the base type.

    Args:
        base: base type
        funcs: all predicate functions are checked against the instance
        attrs: all attributes are checked for equality
    r9   funcsc                 D    t         |   | |j                  |f||d      S )N)r   attrs)superrK   r   )r(   r9   r   r   	__class__s       r   rK   zparametric.__new__   s$    wsDMMD7eV[<\]]r   c                      y r   r   )rQ   ___s      r   rR   zparametric.__init__   s    #r   c                 8    t               t        |di       t        |j                        j	                   j                        xrQ t        t        |dd            j	                   j
                        xr  t         fd j                  D              S )Nr   r   r   c              3   b   K   | ]&  }j                  |      j                  |   k(   ( y wr   )getr   )r/   namer   missingrQ   s     r   r0   z/parametric.__subclasscheck__.<locals>.<genexpr>   s+     XZTEIIdG,

40@@Zs   ,/)rC   r"   rJ   	__bases__
issupersetr   ri   r   )rQ   rl   r   r   s   ` @@r   rm   zparametric.__subclasscheck__   sx    ('2.""#..t~~> YGHgr23>>tzzJYXTZZXX	
r   c                      t               t         j                        xr@ t        fd j                  D              xr  t         fd j
                  D              S )Nc              3   .   K   | ]  } |        y wr   r   )r/   funcrp   s     r   r0   z/parametric.__instancecheck__.<locals>.<genexpr>   s     :ztDNzs   c              3   X   K   | ]!  }t        |      j                  |   k(   # y wr   )r"   r   )r/   r   rp   r   rQ   s     r   r0   z/parametric.__instancecheck__.<locals>.<genexpr>   s+     `U_TGHdG4

48HHU_s   '*)rC   r   r   ri   r   r   )rQ   rp   r   s   ``@r   r{   zparametric.__instancecheck__   sP    (x0 a:tzz::a`UYU_U_``	
r   c                     t        | j                  |j                  z         \  } t        |       |gt        | j                  |j                  z         i | j                  |j                  z  S r   )rJ   r   r%   r   r   )rQ   rY   r9   s      r   __and__zparametric.__and__   sX    dnnu67tDz$]TZZ%++%=!>]4::PUP[P[C[]]r   )r   r   r   r~   r%   r   rK   rR   rm   r{   r   __classcell__r   s   @r   r   r      s3    ^4 ^ ^ &

^r   r   c                     | j                   S r   )r   r'   s    r   <lambda>r      s    r   rl   c                     t        |       t        u rt        fd| j                  D              S t	              }|j                  | |v r|       S t              S )z;Return estimated distance between classes for tie-breaking.c              3   6   K   | ]  }t        |        y wr   )distance)r/   ra   rl   s     r   r0   zdistance.<locals>.<genexpr>   s     Cls8C*lrc   )r   r   minr!   r)   indexrC   )r(   rl   r&   s    ` r   r   r      sK    #%CcllCCC
(
C99C3JS33F33r   c                       e Zd ZU dZeed<   eed<   ej                  ed<   dde	de
e   fdZdde	de
e   fdZed	ed
d fd       Zded
efdZded
efdZded
efdZded
efdZd
efdZd
efdZy)rj   z0A tuple of types that supports partial ordering.requiredparentssigNrH   c                 J    t         j                  | t        t        |            S r   )r8   rK   rI   r   )r(   rH   r   s      r   rK   zsignature.__new__   s    }}S#gu"566r   c                 8    |t        |       | _        y || _        y r   )r2   r   )rQ   rH   r   s      r   rR   zsignature.__init__   s    %-%5D	8r   r   r   c                 l   t        |d      s | d      S t        |      }t        j                  j                  t        j                  j
                  h}t        j                  |      j                  j                         }|D cg c]  }|j                  |v s| }}t        |      D cg c]  \  }}|j                  |v s| }}}|dt        |d      dz    }|D cg c]"  }|j                  |j                  t              $ }}t        d |D              }	 | ||	      S c c}w c c}}w c c}w )z?Return evaluated type hints for positional parameters in order.r   r   Nrf   )defaultr@   c              3   L   K   | ]  }|j                   |j                  u   y wr   )r   empty)r/   params     r   r0   z'signature.from_hints.<locals>.<genexpr>   s     Hu}}3s   "$)rD   r   rs   	ParameterPOSITIONAL_ONLYPOSITIONAL_OR_KEYWORDrj   
parametersru   kind	enumerater   maxr   rC   sum)
r(   r   
type_hintspositionalsparamsr   r   indiceshintsr   s
             r   
from_hintszsignature.from_hints   s    t./r7N#D)
((88':K:K:a:ab",,T2==DDF%+IVEuzz[/H%VI-6v->[->\UE%**PZBZ5->[6#gr2Q67AGH

F3HHHH5(## J[Hs   D&D&-D+D+"'D1rY   c                 j    | j                   t        |      k  xr t        t        t        ||             S r   )r   r2   ri   rI   r,   rX   s     r   __le__zsignature.__le__   s(    }}E
*Ps3z5$3O/PPr   c                     | |k7  xr | |k  S r   r   rX   s     r   __lt__zsignature.__lt__   s    u}..r   c                 6    t        t        t        ||             S )z2Return relative distances, assuming self >= other.r8   rI   r   rX   s     r   __sub__zsignature.__sub__   s    S5$/00r   c                 6    t        t        t        | |            S )z2Return relative distances, assuming self <= other.r   rX   s     r   __rsub__zsignature.__rsub__   s    S4/00r   c                     	 t        | d       xs" t         | j                  j                  |       S # t        $ r Y yw xY w)z8Check positional arity of associated function signature.r   F)rD   r   r   bind_partial	TypeErrorrQ   rH   s     r   callablezsignature.callable   sE    	tU++Rt4IDHH4I4I54Q/RR 		s   03 	??c                 j    | j                   t        |      k  xr t        t        t        ||             S )z+Return whether all arguments are instances.)r   r2   ri   rI   r   rQ   rM   s     r   	instanceszsignature.instances   s(    }}D	)Nc#j$2M.NNr   r   )r   r   r   r~   r   r   rJ   rs   	Signaturer   r	   rK   rR   classmethodr   r   r8   r   r   r   r   r   r   r   r   r   r   rj   rj      s    :ML			7H 7 7Dh D(3- D $h $; $ $QE Qd Q/E /d /1U 1u 11e 1 1$ O$ Or   rj   
REGISTERED.)boundc                   8    e Zd ZU dZeed<   eed<   ee   ed<   d Z	de
fdZeded	efd
       Zeded	e
egef   fd       Zd	e
fdZd Zded	efdZ fdZd Zdede
f fdZdef fdZdedee   d	e
fdZded	e
fdZd	e
fdZd Zd Zed        Z xZS )multimethodz-A callable directed acyclic graph of methods.r   pendinggenericsc                 *   t        j                         j                  j                  j	                  |j
                        }t        |t              r|S t        j                  t        j                  |       |      }t               |_        g |_        |S r   )rs   currentframef_backf_localsr   r   r   r   r   update_wrapperdictrK   rJ   r   r   )r(   r   homonymrQ   s       r   rK   zmultimethod.__new__  sj    &&(//88<<T]]Kg{+N''S(94@ur   r   c                     	 || t         j                  |      <   y # t        t        f$ r | j                  j                  |       Y y w xY wr   )rj   r   	NameErrorAttributeErrorr   addrQ   r   s     r   rR   zmultimethod.__init__  sB    	#/3D%%d+,>* 	#LLT"	#s    *AA_multimethod__funcr   c                      y r   r   )rQ   r   s     r   registerzmultimethod.register  s    :=r   rM   c                      y r   r   r   s     r   r   zmultimethod.register  s    KNr   c                      t              dk(  rHt        d   d      r9t        j                   g   j                  d   j                  k(  r S d   S  fdS )zDecorator for registering a function.

        Optionally call with types to return a decorator for unannotated functions.
        r@   r   r   c                 0    j                  |       xs | S r   )__setitem__)r   rM   rQ   s    r   r   z&multimethod.register.<locals>.<lambda>$  s    D,,T48@D@r   )r2   rD   r   rR   r   r   s   ``r   r   zmultimethod.register  s[    
 t9>gd1g/@A  --==DG,<,<<4I$q'I@@r   c                 6    || S t        j                  | |      S r   rH   
MethodTyperQ   rp   owners      r   __get__zmultimethod.__get__&      'tMU-=-=dH-MMr   rH   c                     t        |       D ch c]  }t        |t              s||k  s| }}||D ch c]  }|j                  D ]  }|  c}}z
  S c c}w c c}}w )z(Find immediate parents of potential key.)listr   rj   r   )rQ   rH   rU   r   parentancestors         r   r   zmultimethod.parents)  sY    "&t*[*3
3	0JsUZ{3*[XvX((XXX \Xs   AAAAc                 f    t        |       D ]"  }t        |t              rt        |   |       $ y)zEmpty the cache.N)r   r   rj   r   __delitem__)rQ   rU   r   s     r   cleanzmultimethod.clean.  s(    :Cc9-#C( r   c                 \    t         j                  t        |             j                  |       S )z/Return a new multimethod with the same methods.)r   rK   r%   __ior__rT   s    r   copyzmultimethod.copy4  s     ||DJ'//55r   c                 V   | j                          t        |t              st        |      }| j                  |      x}|_        t	        j
                  t              5  t        j                  |      |_        d d d        | j                  |d        | D ]J  }||k  s	|r||j                  z  s|xj                  |z  c_        |j                  j                  |       L t        |      D ]  \  }}t        t        j                  |            x}s'| xj                  dg|dz   t!        | j                        z
  z  z  c_        t#        |j%                  | j                  |               | j                  |<    t&        | Q  ||       | j*                  | _        y # 1 sw Y   'xY w)Nr   r@   )r   r   rj   r   
contextlibsuppress
ValueErrorrs   r   popr   r   rJ   r   r}   r   r2   r8   unionr   r   	docstringr~   )	rQ   rH   r   r   rU   r   r(   r}   r   s	           r   r   zmultimethod.__setitem__8  sC   

%+e$E"&,,u"55%-  ,))$/EI -Cs{Gw/Dw&&  $E*JE3gooc233w3"S5G)G!HH',W]]4==;O-P'Qe$ + 	E4(~~ -,s   FF(c                     | j                          t        | 	  |       | D ]'  }||j                  v s| j                  |      |_        ) | j                  | _        y r   )r   r   r   r   r   r~   )rQ   rH   rU   r   s      r   r   zmultimethod.__delitem__K  sL    

E"C#"ll3/  ~~r   keysc                 $   |D ch c]  } |j                   | s| }}|D ch c]  }| |   	 }}t        |      dkD  rt        j                  t              }|D ]  }|||z
     j                  |        |t        |         }|D ch c]  }| |   	 }}t        |      dk(  rt        j                  dt               t        |      dk(  r|j                         S t        | j                   dt        |       d||      c c}w c c}w c c}w )Nr@   z.positional distance tie-breaking is deprecatedz: z methods found)r   r2   r5   defaultdictrJ   r   r   warningswarnDeprecationWarningr   r   r   )rQ   rH   r  rU   r   groupss         r   selectzmultimethod.selectS  s   #<t|s||U';t<&*+dscd+u:> ,,S1Fus{#'', #f+&D*./$3T#Y$E/5zQNPbcu:?99;t}}oRD	{.I5RVWW =+ 0s   DDD	Dc           	          | j                          t        t        t        |            }|| v r| |   S | j	                  || j                  || j                  |                  S )z9Find and cache the next applicable method of given types.)evaluater8   rI   r   
setdefaultr	  r   r   s     r   __missing__zmultimethod.__missing__b  sR    c'5)*D=;udkk%e9L&MNNr   c                 ~   t        t        t        |            }t        t        t        || j
                              s| |   S t        |       D ch c]%  }t        |t              s |j                  | s$|' }}||D ch c]  }|j                  D ]  }|  c}}z  }| j                  ||      S c c}w c c}}w r   )r8   rI   r%   rr   r,   r   r   r   rj   r   r   r	  )rQ   rM   rH   rU   matchesmatchr   s          r   dispatchzmultimethod.dispatchj  s    c$o&3z5$--89;"&t*d*3
3	0J}s}}^bOc3*d'P'%--hH-H'PP{{5'** ePs   B4&B46B4B9c                     | j                           | j                  | }	  ||i |S # t        $ r}t        d|j                         |d}~ww xY w)$Resolve and dispatch to best method.z	Function N)r  r  r   r   __code__)rQ   rM   kwargsr   exs        r   __call__zmultimethod.__call__r  s[    t}}d#	E((( 	E)DMM? ;<"D	Es   ) 	AAAc                     | j                   r@| j                   j                         }|| t        j                  |      <   | j                   r?yy)z(Evaluate any pending forward references.N)r   r   rj   r   r   s     r   r  zmultimethod.evaluate{  s9    ll<<##%D/3D%%d+, llr   c                     g }| j                         D ]K  \  }}t        |dd      }|j                  s |j                  |j                   | d|j                          M dj                  |      S )z3a descriptive docstring of all registered functionsr    z
    z

)rx   r"   r~   appendr   join)rQ   docsrU   r   r   s        r   r   zmultimethod.docstring  sf     IC#ub)C||t}}ocU&GH & {{4  r   )r   r   r   r~   rL   r   rJ   r   r8   rK   r   rR   tp_overloadr   r   r%   r   r   r   r   r   r   rj   r	  r  r  r  r  propertyr   r   r   s   @r   r   r      s   7ML5k#X # =z=j= =NdNxj0H'IN NA ANYU Ys Y
)6& &h &&& &XE XY XH XO O8 O+ +E4 ! !r   r   RETURNc                        e Zd ZU dZeeej                  f   ed<   de	de
f   ddfdZde	de
f   ddfd	Zde	de
f   fd
Zdede	f fdZdedede
fdZ xZS )multidispatchzWrapper for compatibility with `functools.singledispatch`.

    Only uses the [register][multimethod.multimethod.register] method instead of namespace lookup.
    Allows dispatching on keyword arguments based on the first function signature.
    
signaturesr   .r   zmultidispatch[RETURN]c                 T    t        j                  t        j                  |       |      S r   )r   r   r   rK   )r(   r   s     r   rK   zmultidispatch.__new__  s    ''S(94@@r   Nc                 H    t               | _        g | _        i | _        || d<   y )Nr   )rJ   r   r   r#  r   s     r   rR   zmultidispatch.__init__  s"    uRr   c                 6    || S t        j                  | |      S r   r   r   s      r   r   zmultidispatch.__get__  r   r   rH   c                 
   t         |   ||       t        j                  t              5  t        j                  |      }| j                  j                  t        |j                        |       d d d        y # 1 sw Y   y xY wr   )r   r   r   r   r   rs   rj   r#  r  r8   r   )rQ   rH   r   rj   r   s       r   r   zmultidispatch.__setitem__  s[    E4(  ,))$/IOO&&uY-A-A'BIN -,,s   AA99BrM   r  c                    |}|r_| j                   j                         D ]B  }t        j                  t              5   |j
                  |i |j                  }	 ddd        n  | j                  | } ||i |S # 1 sw Y   exY w)r  N)r#  ru   r   r   r   bindrM   r  )rQ   rM   r  r   rj   r   s         r   r  zmultidispatch.__call__  s    !__335	((3+Y^^T<V<AAF 43 6 t}}f%T$V$$	 43s   A;;B	)r   r   r   r~   r   r8   rs   r   r   r   r   rK   rR   r   r   r   r  r   r   s   @r   r"  r"    s     UG---..A8CK0 A5L AXc6k2 t N(3;*? NO Oh O	%c 	%S 	%V 	%r   r"  rH   c                  @     t        t        t                       fdS )zPartially bound `isinstance`.c                     t        |       S r   r`   )ra   rH   s    r   r   zisa.<locals>.<lambda>  s    z#u-r   )r8   rI   r   )rH   s   `r   isar,    s    #gu%&E--r   c                        e Zd ZU dZeed<   ej                  Z fdZde	fdZ
ede	dej                  fd       Zd Zde	de	fd	Z xZS )
r   zEOrdered functions which dispatch based on their annotated predicates.r   c                 @   t        j                         j                  j                  }|j                  |vrt        j                  dt               t        j                  t        | -  |       |      }t               |_        |j                  |j                  |      S )Nz2use `parametric(<base>, <func>)` as a type instead)rs   r   r   r   r   r  r  r  r   r   r   rK   rJ   r   r   )r(   r   rO   rQ   r   s       r   rK   zoverload.__new__  sr    ((*11::	==	)MMNPbc''(<dCu}}T]]D11r   r   c                     	 | j                  |      }|| |<   y # t        t        f$ r | j                  j	                  |       Y y w xY wr   )rj   r   r   r   r   )rQ   r   r   s      r   rR   zoverload.__init__  sH    	..&C DI >* 	#LLT"	#s    *AAr   c                     t        |      j                         D ]E  \  }}t        |      rt        |t              st        |d      s.t        |      |j                  |<   G t        j                  |      S rW   )
r   rx   r   r   r%   rD   r,  r   rs   rj   )r(   r   r   values       r   rj   zoverload.signature  s_    )$/557KD%E?j&=P\A]-0Z$$T* 8   &&r   c                    | j                   r;| j                   j                         }|| | j                  |      <   | j                   r;t        |       D ]X  }	  |j                  |i |j
                  t        fd|j                  j                         D              sM | |   |i |c S  t        d      # t        $ r Y qw xY w)z$Dispatch to first matching function.c              3      K   | ]9  \  }}|v r0|j                   |j                  u xs |j                  |          ; y wr   )
annotationr   )r/   r   r   	argumentss      r   r0   z$overload.__call__.<locals>.<genexpr>  sK      #9KD%9$   EKK/T53C3CIdO3TT#9s   ?AzNo matching functions found)r   r   rj   reversedr)  r5  r   ri   r   rx   r   )rQ   rM   r  r   r   r5  s        @r   r  zoverload.__call__  s    ll<<##%D)-D%& ll D>C$CHHd5f5??	  #&>>#7#7#9 
 !tCy$1&11 " 9::  s   B::	CCc                 ^    | j                  |       | j                  |j                  k(  r| S |S )z%Decorator for registering a function.)rR   r   r   s     r   r   zoverload.register  s(    d}}5t?4?r   )r   r   r   r~   rJ   r   r   r   rK   r   rR   r   rs   r   rj   r  r   r   r   s   @r   r   r     sj    OL!!G2X  'X ''*;*; ' ';$@X @( @r   r   c                   &    e Zd ZdZ G d de      Zy)	multimetaz3Convert all callables in namespace to multimethods.c                   $     e Zd Zd Z fdZ xZS )multimeta.__prepare__c                       y r   r   )rM   s    r   rR   zmultimeta.__prepare__.__init__  s    r   c                     t        |      r& t        | j                  |      dt              |      }t        |   ||       y )Nr   )r   r"   r   r   r   r   )rQ   rU   r1  r   s      r   r   z!multimeta.__prepare__.__setitem__  s6    Gz;GNGU+r   )r   r   r   rR   r   r   r   s   @r   __prepare__r;    s    		, 	,r   r>  N)r   r   r   r~   r   r>  r   r   r   r9  r9    s    =,d ,r   r9  )-r-   r5   r   r   rs   ry   rH   r   r  collections.abcr   r   r   r   r   r   r	   r
   r   r   r   r  r   r   r   r8   r#   r)   r:   r.   r   r   r}   r   r%   r   r   rj   r   r   r   r   r"  r,  r9  r   r   r   <module>r@     sK   
         A A b b b	I 	OE AE AElckk l^!^ !^H   %> ?4D 4S 44O 4On \#s();<
J!$ J!Z 
	$%KeD#I&6f8M&M!N $%N. . .2@t 2@j
, 
,r   