
    tAc                         d dl mZmZ d dlmZmZmZmZmZ d dl	Z	ddl
mZ e	j         G d d                      Z G d d	          Z e	j        d
           G d d                      ZdS )    )	lru_cachesingledispatch)AnyCallableListTupleUnionN   )StructureHandlerNotFoundErrorc                       e Zd ZdZdS )_DispatchNotFoundz4A dummy object to help signify a dispatch not found.N)__name__
__module____qualname____doc__     1/usr/lib/python3/dist-packages/cattrs/dispatch.pyr   r   	   s        >>Dr   r   c                       e Zd ZdZdZd Zd Zddeddfd	Zd
e	e
eeegef         ef         eeegef         eef         f                  fdZd Zd ZdefdZddd defdZdS )MultiStrategyDispatchzu
    MultiStrategyDispatch uses a combination of exact-match dispatch,
    singledispatch, and FunctionDispatch.
    )_direct_dispatch_function_dispatch_single_dispatch_generatorsdispatchc                     i | _         t                      | _        | j                            d |           t	          t
                    | _         t          d           | j                  | _	        d S )Nc                     dS )NTr   )_s    r   <lambda>z0MultiStrategyDispatch.__init__.<locals>.<lambda>!   s    4 r   )maxsize)
r   FunctionDispatchr   registerr   r   r   r   	_dispatchr   )selffallback_funcs     r   __init__zMultiStrategyDispatch.__init__   sf     ""2"4"4((GGG ./@ A A/	$///??r   c                     	 | j                             |          }|t          ur|S n# t          $ r Y nw xY w| j                            |          }||S | j                            |          S N)r   r   r   	Exceptionr   getr   )r$   clr   direct_dispatchs       r   r#   zMultiStrategyDispatch._dispatch%   s    	,55b99H000 1 	 	 	D	 /33B77&""&//333s   $( 
55FdirectreturnNc                     |D ]A\  }}|r|| j         |<   | j                            ||           |                                  B| j                                         dS )z-Register a class to direct or singledispatch.N)r   r   r"   clear_directr   cache_clear)r$   cls_and_handlerr-   clshandlers        r   register_cls_listz'MultiStrategyDispatch.register_cls_list3   su    + 	$ 	$LC $-4%c**%..sG<<<!!####!!#####r   pred_and_handlerc                    |D ]Y}t          |          dk    r!|\  }}| j                            ||           6|\  }}}| j                            |||           Z|                                  | j                                         dS )zo
        Register a predicate function to determine if the handle
        should be used for the type.
           )is_generatorN)lenr   r"   r0   r   r1   )r$   r6   tupfuncr4   is_gens         r   register_func_listz(MultiStrategyDispatch.register_func_list=   s     $ 	U 	UC3xx1}} #g'00w????(+%gv'00wV0TTTT!!#####r   c                 8    | j                                          dS )zClear the direct dispatch.N)r   clearr$   s    r   r0   z"MultiStrategyDispatch.clear_directT   s    ##%%%%%r   c                 j    | j                                          | j                                         dS )zClear all caches.N)r   r@   r   r1   rA   s    r   clear_cachez!MultiStrategyDispatch.clear_cacheX   s1    ##%%%!!#####r   c                 4    | j                                         S r(   )r   get_num_fnsrA   s    r   rE   z!MultiStrategyDispatch.get_num_fns]   s    &22444r   r   otherskipc                     | j                             |j         |           | j        j                                        D ] \  }}|j                            ||           !d S )N)rG   )r   copy_tor   registryitemsr"   )r$   rF   rG   r3   fns        r   rI   zMultiStrategyDispatch.copy_to`   sl    ''(@t'LLL,5;;== 	5 	5GC"++C4444	5 	5r   Fr   )r   r   r   r   	__slots__r&   r#   boolr5   r   r	   r   r   r   r>   r0   rC   intrE   rI   r   r   r   r   r      s.        
I@ @ @4 4 4$ $ $$ $ $ $ $$hud{+S01hud{+S$679
$ $ $ $.& & &$ $ $
5S 5 5 5 55 54 5C 5 5 5 5 5 5r   r   T)slotsc                       e Zd ZU dZ ej        e          Zeed<   dde	e
gef         fdZd Zdefd	Zddd defdZdS )r!   a  
    FunctionDispatch is similar to functools.singledispatch, but
    instead dispatches based on functions that take the type of the
    first argument in the method, and return True or False.

    objects that help determine dispatch should be instantiated objects.
    )factory_handler_pairsF
can_handlec                 B    | j                             d|||f           d S )Nr   )rU   insert)r$   rV   r<   r9   s       r   r"   zFunctionDispatch.registerr   s(    ""1z4&FGGGGGr   c                     | j         D ]8\  }}}	  ||          }n# t          $ r Y w xY w|r|r ||          c S |c S 9t          d| |          )zI
        returns the appropriate handler, for the object passed.
        zunable to find handler for )type_)rU   r)   r   )r$   typrV   r4   r9   chs         r   r   zFunctionDispatch.dispatchu   s     261D 	# 	#-JZ__    # #"73<<'''"NNN	#
 ,/#//s
 
 
 	
s   
((r.   c                 *    t          | j                  S r(   )r:   rU   rA   s    r   rE   zFunctionDispatch.get_num_fns   s    4&'''r   r   rF   rG   c                 T    |j                             | j         |d                     d S r(   )rU   extend)r$   rF   rG   s      r   rI   zFunctionDispatch.copy_to   s+    ##D$7$>?????r   NrM   rN   )r   r   r   r   attriblistrU   __annotations__r   r   rP   r"   r   rQ   rE   rI   r   r   r   r!   r!   f   s           #474000ND000H H8SE4K#8 H H H H
 
 
*(S ( ( ( (@ @/ @s @ @ @ @ @ @r   r!   )	functoolsr   r   typingr   r   r   r   r	   r`   errorsr   sr   r   r!   r   r   r   <module>rh      s!   / / / / / / / / 4 4 4 4 4 4 4 4 4 4 4 4 4 4  1 1 1 1 1 1 	 	 	 	 	 	 	 	S5 S5 S5 S5 S5 S5 S5 S5l d'@ '@ '@ '@ '@ '@ '@ '@ '@ '@r   