
    I/Ph>L              
       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         !                    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,dS )"    N)CallableIterableIteratorMapping)AnyLiteralOptionalTypeVarUnionget_type_hintsoverloadc                       e Zd ZdS )DispatchErrorN)__name__
__module____qualname__     T/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/multimethod/__init__.pyr   r      s        Dr   r   c                 b    t          | t                    r| j        nt          j        |           S N)
isinstancesubtype
__origin__typing
get_origintps    r   r   r      s(    &r733N2==9J29N9N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#      sK    "g +&"3B"7"78"C"Cr:r***?2r   c                     t          | t                    rt                              |           n|                                 S r   )r   typemroclss    r   get_mror)      s-    &sD11@488C===swwyy@r   c                       t          j                     D ].}                    d t          |          D                        /t	           fdD                       S )Nc              3   h   K   | ]-}t          t          j        t          |                    )|V  .d S r   )
issubclassabcABCMetar%   ).0r(   s     r   	<genexpr>zcommon_bases.<locals>.<genexpr>#   s:      YYcjdSVii6X6XYcYYYYYYr   c              3   N   K   | ]}|         t                    k    |V   d S r   )len)r/   r(   basescountss     r   r0   zcommon_bases.<locals>.<genexpr>$   s7      DD&+U*C*C*C*C*C*CDDr   )collectionsCounterupdater)   tuple)r3   baser4   s   ` @r   common_basesr:       ss     ""F Z ZYYWT]]YYYYYYYDDDDDDD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dS )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|R  S t          t          d          r(t          |t          j                  r | |j        g|R  S t          |t                    r'|j	        r | t          |j	                 g|R  nt          S t          |t          j                  r | |j        g|R  S t          |          p|}t          t          d          r!t          |t          j                  rt          }t!          t#          | t%          |          p|                    }t'          |          t          hk    r|t           u r|s|S t)          |          t(          t*          j        fv r|fnd}|t.          u r7 | 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(                              | 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   sJ   99M2'' 	03r'/$////6?++ 	,
2v?S0T0T 	,3r|+d++++b'"" 	[<><NZ33uR/0848888TZZb&011 	-3r},t,,,,B%25+&& 	:b%/+J+J 	FShrll2d3344t99  &E//d/M!&\\dCK-@@@		bWSuSt__556779EU?? $'+EQx4QxX$rr(f"4"48D#)t<<	||CR%;;;r   c                     d S r   r   )selfr   rM   s      r   __init__zsubtype.__init__N         r   r   c                 "    | j         g| j        R S r   rB   rQ   s    r   keyzsubtype.keyP   s    ....r   c                     t          |d          o/|                                 t                              |          k    S Nr   )rD   rV   r   rQ   others     r   __eq__zsubtype.__eq__S   s0    ul++P

gkk%>P>P0PPr   c                 D    t          |                                           S r   )hashrV   rU   s    r   __hash__zsubtype.__hash__V   s    DHHJJr   c                     t          |          p|}t          |          }|t          u rt           fd|D                       S |t          u rt           fd|D                       S  j        t          u rdS  j        t          u rt          | j                  S  j        t          u rs|t          u oit           j        dd                    t          |dd                    k    o4t          |d d                   t           j        d d                   k    S t          |          t           j                  k    o@t          | j                  o+t          d t          | j                  D                       S )Nc              3   8   K   | ]}t          |          V  d S r   r   )r/   argrQ   s     r   r0   z,subtype.__subclasscheck__.<locals>.<genexpr>]   -      ==z#t,,======r   c              3   8   K   | ]}t          |          V  d S r   r,   )r/   r(   rQ   s     r   r0   z,subtype.__subclasscheck__.<locals>.<genexpr>_   rc   r   Fc              3   H   K   | ]}|d          |d         u pt          | V  dS )r   r@   Nre   )r/   pairs     r   r0   z,subtype.__subclasscheck__.<locals>.<genexpr>m   s9      aaDGtAw&;*d*;aaaaaar   )r   r#   r   allr   r   r,   r!   r   	signaturer2   zip)rQ   subclassrN   rM   s   `   r   __subclasscheck__zsubtype.__subclasscheck__Y   s   H%%1!!W==========U??==========?g%%5?e##h666?h&&(" JdmBCC011YtBCCy5I5IIJd3B3i((IdmCRC6H,I,II IIT]+++ b64?33baaDRVR_H`H`aaa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                  ot          | j                  S t          | j                   rt          t                    rdS | j         t          u r?t          t          t          gt                                                    R  |           S | j         t"          u r;| j        dd          dk    r(t%                    t%          | j                  k    rdS nZt          | t&                    r0t)          t+                                                    d          nt/          j        d          t3          t5          t
          | j                            S )Nc              3   d   K   | ]*}t          |          t                    k    o|k    V  +d S r   )r%   )r/   rb   instances     r   r0   z,subtype.__instancecheck__.<locals>.<genexpr>r   s=      ``3tCyyDNN2Fsh``````r   __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_``````?e##h6668-.. 	=h5t<<<?d""?8,,THdm1T1TT(DO44 	
8X8V8V 	5?h&&ghS1I1I1P1P1R1RSSSUYZZZ?e##bcc(:f(D(D8}}DM 2 222u 3g&& 	5D!1!122B77HH '!44H3z8T];;<<<r   c              #     K   t          |           }|t          u r/t          t          t          | j                            E d{V  dS |t          u r,| j        D ]"}t                              |          E d{V  #dS ||V  dS dS )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   rb   s      r   r}   zsubtype.origins   s       D!!W3tT]3344444444444u__} 0 0"??3//////////0 0LLLLL  r   N)r   r   r   __doc__r%   __annotations__r8   rK   rR   rV   boolr[   intr^   rm   r{   	functoolssingledispatchr   r}   r   r   r   r   r   '   s           OOO< < <: '&&/U / / / /Qt Q Q Q 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                 ^    t                                          | |j        |f||d          S )N)r   attrs)superrK   r   )r(   r9   r   r   	__class__s       r   rK   zparametric.__new__   s,    wwsDMD7eV[<\<\]]]r   c                     d S r   r   )rQ   ___s      r   rR   zparametric.__init__   rS   r   c                 N    t                      t          |di           t          |j                                       j                  oWt          t          |dd                                         j                  o!t           fd j        D                       S )Nr   r   r   c              3   b   K   | ])}                     |          j        |         k    V  *d S r   )getr   )r/   namer   missingrQ   s     r   r0   z/parametric.__subclasscheck__.<locals>.<genexpr>   s=      XXTEIIdG,,
40@@XXXXXXr   )rC   r"   rJ   	__bases__
issupersetr   ri   r   )rQ   rl   r   r   s   ` @@r   rm   zparametric.__subclasscheck__   s    (('2.."##..t~>> YGHgr2233>>tzJJYXXXXXXTZXXXXX	
r   c                      t                      t           j                  oAt          fd j        D                       o!t           fd j        D                       S )Nc              3   .   K   | ]} |          V  d S r   r   )r/   funcrp   s     r   r0   z/parametric.__instancecheck__.<locals>.<genexpr>   s+      ::tDDNN::::::r   c              3   X   K   | ]$}t          |          j        |         k    V  %d S r   )r"   r   )r/   r   rp   r   rQ   s     r   r0   z/parametric.__instancecheck__.<locals>.<genexpr>   s;      ``TGHdG44
48HH``````r   )rC   r   r   ri   r   r   )rQ   rp   r   s   ``@r   r{   zparametric.__instancecheck__   sz    ((x00 a::::tz:::::a``````UYU_`````	
r   c                     t          | j        |j        z             \  } t          |           |gt          | j        |j        z             R i | j        |j        z  S r   )rJ   r   r%   r   r   )rQ   rZ   r9   s      r   __and__zparametric.__and__   s\    dnu677tDzz$]TZ%+%=!>!>]]]4:PUP[C[]]]r   )r   r   r   r~   r%   r   rK   rR   rm   r{   r   __classcell__r   s   @r   r   r      s         ^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	                    }|                    | |v r| nt                    S )z;Return estimated distance between classes for tie-breaking.c              3   8   K   | ]}t          |          V  d S r   )distance)r/   rb   rl   s     r   r0   zdistance.<locals>.<genexpr>   s-      CCs8C**CCCCCCr   )r   r   minr!   r)   indexrC   )r(   rl   r&   s    ` r   r   r      sd    #%CCCCclCCCCCC
(

C99C3JJSSF3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dS )rj   z0A tuple of types that supports partial ordering.requiredparentssigNrH   c                 ^    t                               | t          t          |                    S r   )r8   rK   rI   r   )r(   rH   r   s      r   rK   zsignature.__new__   s     }}S#gu"5"5666r   c                 6    |t          |           n|| _        d S r   )r2   r   )rQ   rH   r   s      r   rR   zsignature.__init__   s    %-%5D			8r   r   r   c                    t          |d          s | d          S t          |          t          j        j        t          j        j        ht          j        |          j                                        }fd|D             }fdt          |          D             }|dt          |d          dz            }fd	|D             }t          d
 |D                       } | ||          S )z?Return evaluated type hints for positional parameters in order.r   r   c                 &    g | ]}|j         v |S r   )kind)r/   parampositionalss     r   
<listcomp>z(signature.from_hints.<locals>.<listcomp>   s%    IIIEuz[/H/H%/H/H/Hr   c                 ,    g | ]\  }}|j         v |S r   )r   )r/   r   r   
type_hintss      r   r   z(signature.from_hints.<locals>.<listcomp>   s*    [[[\UE%*PZBZBZ5BZBZBZr   Nrf   )defaultr@   c                 P    g | ]"}                     |j        t                    #S r   )r   r   rC   )r/   r   r   s     r   r   z(signature.from_hints.<locals>.<listcomp>   s)    HHH
F33HHHr   c              3   2   K   | ]}|j         |j        u V  d S r   )r   empty)r/   r   s     r   r0   z'signature.from_hints.<locals>.<genexpr>   s+      HHu}3HHHHHHr   )rD   r   rs   	ParameterPOSITIONAL_ONLYPOSITIONAL_OR_KEYWORDrj   
parametersru   	enumeratemaxsum)r(   r   paramsindiceshintsr   r   r   s         @@r   
from_hintszsignature.from_hints   s    t.// 	3r77N#D))
(8':K:ab",T22=DDFFIIIIVIII[[[[Yv->->[[[6#gr222Q667HHHHHHHHHHHHHHs5(###r   rZ   c                 x    | j         t          |          k    o"t          t          t          ||                     S r   )r   r2   ri   rI   r,   rY   s     r   __le__zsignature.__le__   s.    }E

*Ps3z5$3O3O/P/PPr   c                     | |k    o| |k    S r   r   rY   s     r   __lt__zsignature.__lt__   s    u}..r   c                 H    t          t          t          ||                     S )z2Return relative distances, assuming self >= other.r8   rI   r   rY   s     r   __sub__zsignature.__sub__   s    S5$//000r   c                 H    t          t          t          | |                    S )z2Return relative distances, assuming self <= other.r   rY   s     r   __rsub__zsignature.__rsub__   s    S4//000r   c                     	 t          | d           pt           | j        j        |           S # t          $ r Y dS 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   sV    	tU+++Rt4IDH4I54Q/R/RR 	 	 	55	s   ,/ 
==c                 x    | j         t          |          k    o"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$2M2M.N.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        ::MMMLLL		7 7H 7 7 7 7 7D Dh D(3- D D D D $h $; $ $ $ [$QE Qd Q Q Q Q/E /d / / / /1U 1u 1 1 1 11e 1 1 1 1 1$    O$ O O O O O Or   rj   
REGISTERED.)boundc                   \    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                  }t          |t                    r|S t          j	        t                              |           |          }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__  sr    &((/8<<T]KKg{++ 	N'S(9(94@@uur   r   c                     	 || t                               |          <   d S # t          t          f$ r | j                            |           Y d S w xY wr   )rj   r   	NameErrorAttributeErrorr   addrQ   r   s     r   rR   zmultimethod.__init__  sd    	#/3D%%d++,,,>* 	# 	# 	#LT""""""	#s   ! +AA_multimethod__funcr   c                     d S r   r   )rQ   r   s     r   registerzmultimethod.register  s    :=#r   rM   c                     d S r   r   r   s     r   r   zmultimethod.register  s    KN3r   c                      t                    dk    rHt          d         d          r2t          j         gR    j        d         j        k    r n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                 4                         |           p| S r   )__setitem__)r   rM   rQ   s    r   r   z&multimethod.register.<locals>.<lambda>$  s    D,,T488@D r   )r2   rD   r   rR   r   r   s   ``r   r   zmultimethod.register  st    
 t99>>gd1g/@AA> -----=DG,<<<44$q'I@@@@@@r   c                 4    || nt          j        | |          S r   rH   
MethodTyperQ   rp   owners      r   __get__zmultimethod.__get__&      'ttU-=dH-M-MMr   rH   c                 X    fdt          |           D             }|d |D             z
  S )z(Find immediate parents of potential key.c                 J    h | ]}t          |t                    |k     | S r   )r   rj   r/   rV   rH   s     r   	<setcomp>z&multimethod.parents.<locals>.<setcomp>+  s.    [[[3
3	0J0J[sUZ{{3{{{r   c                 &    h | ]}|j         D ]}|S r   r   )r/   parentancestors      r   r   z&multimethod.parents.<locals>.<setcomp>,  s'    XXXvXXX(XXXXr   )list)rQ   rH   r   s    ` r   r   zmultimethod.parents)  s<    [[[[$t**[[[XXXXXXXr   c                     t          |           D ]8}t          |t                    s!t                                          |           9dS )zEmpty the cache.N)r   r   rj   r   __delitem__)rQ   rV   r   s     r   cleanzmultimethod.clean.  sM    :: 	) 	)Cc9-- )##C(((	) 	)r   c                 v    t                               t          |                                         |           S )z/Return a new multimethod with the same methods.)r   rK   r%   __ior__rU   s    r   copyzmultimethod.copy4  s(    ||DJJ''//555r   c                    |                                   t          |t                    st          |          }|                     |          x}|_        t	          j        t                    5  t          j        |          |_        d d d            n# 1 swxY w Y   | 	                    |d            | D ]>}||k     r6|r
||j        z  r*|xj        |z  c_        |j        
                    |           ?t          |          D ]\  }}t          t                              |                    x}ra| xj        dg|dz   t!          | j                  z
  z  z  c_        t#          |                    | j        |                             | j        |<   t'                                          ||           | j        | _        d S )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   rV   r   r(   r}   r   s	           r   r   zmultimethod.__setitem__8  s   

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

E""" 	0 	0C##"ll3//~r   keysc                     fd|D             } fd|D             }t          |          dk    rt          j        t                    }|D ] }||z
                               |           !|t          |                   } fd|D             }t          |          dk    rt          j        dt                     t          |          dk    r|	                                S t           j         dt          |           d|          )Nc                 (    h | ]} |j          |S r   )r   r   s     r   r   z%multimethod.select.<locals>.<setcomp>T  s'    <<<|s|U';<<<<r   c                      h | ]
}|         S r   r   r/   rV   rQ   s     r   r   z%multimethod.select.<locals>.<setcomp>U  s    +++sc+++r   r@   c                      h | ]
}|         S r   r   r  s     r   r   z%multimethod.select.<locals>.<setcomp>[  s    ///3T#Y///r   z.positional distance tie-breaking is deprecatedz: z methods found)r2   r5   defaultdictrJ   r   r   warningswarnDeprecationWarningr  r   r   )rQ   rH   r  r   groupsrV   s   ``    r   selectzmultimethod.selectS  s   <<<<t<<<++++d+++u::>> ,S11F - -us{#'',,,,#f++&D////$///E5zzQNPbcccu::??99;;t}IID		III5RVWWWr   c           	          |                                   t          t          t          |                    }|| v r| |         S |                     ||                     ||                     |                              S )z9Find and cache the next applicable method of given types.)evaluater8   rI   r   
setdefaultr  r   r   s     r   __missing__zmultimethod.__missing__b  sg    c'5))**D==;udkk%e9L9L&M&MNNNr   c                 (   t          t          t                              }t          t          t          || j                            s| |         S fdt          |           D             }|d |D             z  }|                     ||          S )Nc                 R    h | ]#}t          |t                     |j         !|$S r   )r   rj   r   )r/   rV   rM   s     r   r   z'multimethod.dispatch.<locals>.<setcomp>n  s7    ddd3
3	0J0Jd}s}^bOcd3dddr   c                 &    h | ]}|j         D ]}|S r   r   )r/   matchr   s      r   r   z'multimethod.dispatch.<locals>.<setcomp>o  s'    PPP%-PPhHPPPPr   )r8   rI   r%   rr   r,   r   r   r  )rQ   rM   rH   matchess    `  r   dispatchzmultimethod.dispatchj  s    c$oo&&3z5$-8899 	;dddd$t**dddPP'PPPP{{5'***r   c                     |                                    | 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  sv    t}d#	E4(((( 	E 	E 	E ;DM ; ;<<"D	Es   ( 
AA

Ac                     | j         r?| j                                         }|| t                              |          <   | j         =dS dS )z(Evaluate any pending forward references.N)r   r  rj   r   r   s     r   r  zmultimethod.evaluate{  sW    l 	4<##%%D/3D%%d++, l 	4 	4 	4 	4 	4r   c                     g }|                                  D ]C\  }}t          |dd          }|j        r&|                    |j         | d|j                    Dd                    |          S )z3a descriptive docstring of all registered functionsr    z
    z

)rx   r"   r~   appendr   join)rQ   docsrV   r   r   s        r   r	  zmultimethod.docstring  s~      	I 	IIC#ub))C| It}GcGGGGHH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      sG        77MMMLLL5k  #X # # # # =z=j=== [=NdNxj0H'INNN [NA A A A AN N NYU Ys Y Y Y Y
) ) ) ) )6 6 6& &h & & & & & &&& & & & & & &XE XY XH X X X XO O8 O O O O+ + + + +E E E4 4 4 ! ! X! ! ! ! !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          j        t                              |           |          S r   )r   r   r   rK   )r(   r   s     r   rK   zmultidispatch.__new__  s!    'S(9(94@@@r   Nc                 R    t                      | _        g | _        i | _        || d<   d S )Nr   )rJ   r   r   r2  r   s     r   rR   zmultidispatch.__init__  s(    uuRr   c                 4    || nt          j        | |          S r   r   r   s      r   r   zmultidispatch.__get__  r   r   rH   c                 2   t                                          ||           t          j        t                    5  t          j        |          }| j                            t          |j
                  |           d d d            d S # 1 swxY w Y   d S r   )r   r   r  r  r  rs   rj   r2  r  r8   r   )rQ   rH   r   rj   r   s       r   r   zmultidispatch.__setitem__  s    E4((( ,, 	O 	O)$//IO&&uY-A'B'BINNN	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	O 	Os   ABBBrM   r$  c                     |}|ra| j                                         D ]G}t          j        t                    5   |j        |i |j        }	 ddd            n# 1 swxY w Y   H | j        | } ||i |S )r"  N)r2  ru   r  r  r   bindrM   r   )rQ   rM   r$  r   rj   r   s         r   r&  zmultidispatch.__call__  s     	!_3355  	(33  +Y^T<V<<AF                 t}f%tT$V$$$s   AA	!A	)r   r   r   r~   r   r8   rs   r   r   r   r/  rK   rR   r   r   r   r&  r   r   s   @r   r1  r1    s)          UG--....A8CK0 A5L A A A AXc6k2 t    N(3;*? N N N NO Oh O O O O O O	%c 	%S 	%V 	% 	% 	% 	% 	% 	% 	% 	%r   r1  rH   c                  R     t          t          t                                 fdS )zPartially bound `isinstance`.c                 $    t          |           S r   ra   )rb   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                 H   t          j                    j        j        }|j        |vrt          j        dt                     t          j	        t                                          |           |          }t                      |_        |                    |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__  s{    (**1:	=	))MNPbccc'(<(<dCCuu}}T]D111r   r   c                     	 |                      |          }|| |<   d S # t          t          f$ r | j                            |           Y d S w xY wr   )rj   r   r   r   r   )rQ   r   r   s      r   rR   zoverload.__init__  sh    	..&&C DIII >* 	# 	# 	#LT""""""	#s    +AAr   c                    t          |                                          D ]P\  }}t          |          r%t          |t                    st          |d          rt          |          |j        |<   Qt          j	        |          S rX   )
r   rx   r   r   r%   rD   r;  r   rs   rj   )r(   r   r   values       r   rj   zoverload.signature  s    )$//5577 	8 	8KD%E?? 8j&=&= 8P\A]A] 8-0ZZ$T* &&&r   c                    | j         r8| j                                         }|| |                     |          <   | j         8t          |           D ]h}	  |j        |i |j        n# t          $ r Y "w xY wt          fd|j        	                                D                       r | |         |i |c S it          d          )z$Dispatch to first matching function.c              3   x   K   | ]4\  }}|v 	|j         |j        u p|                     |                   V  5d S r   )
annotationr   )r/   r   r   	argumentss      r   r0   z$overload.__call__.<locals>.<genexpr>  s_        D%9$$  EK/T53C3CIdO3T3T$$$$ r   zNo matching functions found)r   r  rj   reversedr8  rD  r   ri   r   rx   r   )rQ   rM   r$  r   r   rD  s        @r   r&  zoverload.__call__  s   l 	.<##%%D)-D%%& l 	. D>> 
	2 
	2C$CHd5f55?		       #&>#7#7#9#9     2
 !tCy$1&111112 9:::s   A&&
A32A3c                 T    |                      |           | j        |j        k    r| n|S )z%Decorator for registering a function.)rR   r   r   s     r   r   zoverload.register  s,    d}55tt4?r   )r   r   r   r~   rJ   r   r   r   rK   r   rR   r   rs   r   rj   r&  r   r   r   s   @r   r   r     s         OOLLL!G2 2 2 2 2X     'X ''*; ' ' ' ['; ; ;$@X @( @ @ @ @ @ @ @ @r   r   c                   .    e Zd ZdZ G d de          ZdS )	multimetaz3Convert all callables in namespace to multimethods.c                   $     e Zd Zd Z fdZ xZS )multimeta.__prepare__c                      d S r   r   )rM   s    r   rR   zmultimeta.__prepare__.__init__  s    Dr   c                     t          |          r2 t          |                     |          dt                    |          }t	                                          ||           d S )Nr   )r   r"   r   r   r   r   )rQ   rV   r@  r   s      r   r   z!multimeta.__prepare__.__setitem__  sW     OGz;GGNNGGU+++++r   )r   r   r   rR   r   r   r   s   @r   __prepare__rJ    sG        	 	 		, 	, 	, 	, 	, 	, 	, 	, 	,r   rM  N)r   r   r   r~   r   rM  r   r   r   rH  rH    sD        ==, , , , ,d , , , , ,r   rH  )-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/  r1  r;  rH  r   r   r   <module>rO     sW   



                     A A A A A A A A A A A A b b b b b b b b b b b b b b b b b b	 	 	 	 	I 	 	 	O O OE    AE A A A AE E El l l l lck l l l^!^ !^ !^ !^ !^ !^ !^ !^H   %>%> ? ? ?4D 4S 4 4 4 44O 4O 4O 4O 4O 4O 4O 4On W\#s();<<<
J! J! J! J! J!$ J! J! J!Z 
		$% $% $% $% $%KeD#I&6f8M&M!N $% $% $%N. . . . . .2@ 2@ 2@ 2@ 2@t 2@ 2@ 2@j
, 
, 
, 
, 
, 
, 
, 
, 
, 
,r   