o
    H�^N´
  ã                   @   sz   d gZ zddlmZmZ eefZW n ey   eZdZY nw dd „ Zdd„ Ze	dkr;ddl
Z
e
 ¡ Ze eƒ ¡ dS dS )Úgenericé    )Ú	ClassTypeÚInstanceTypeNc                    s¶   t ƒ ‰‡‡‡fdd„}t ˆt|i‰ˆj‰‡‡fdd„}i ‰ ˆ j‰‡ ‡fdd„}‡‡‡‡fdd„}ˆj|_ˆj ¡ |_ˆj|_ˆj|_||_||_	ˆ|_
‡ fd	d
„|_‡fdd
„|_|S )z Create a simple generic functionc                     sV   | d j }t|j|tfi ƒjD ]}ˆ |ˆƒ}|ˆur#|| i |¤Ž  S qˆ| i |¤ŽS )Nr   )Ú	__class__ÚtypeÚ__name__ÚobjectÚ__mro__)ÚargsÚkwÚclsÚtÚf)Ú_gbtÚ	_sentinelÚfunc© ú//usr/lib/python3/dist-packages/simplegeneric.pyÚ	_by_class   s   

ÿzgeneric.<locals>._by_classc                     s6   ˆ D ]}t |tƒstd|f ƒ‚q‡‡‡ fdd„}|S )zADecorator to add a method that will be called for the given typesz%r is not a type or classc                    s.   ˆD ]}ˆ   || ¡| urtdˆ|f ƒ‚q| S )Nz!%r already has method for type %r)Ú
setdefaultÚ	TypeError)r   r   )Ú_by_typer   Útypesr   r   Údecorate!   s   
ÿÿz,generic.<locals>.when_type.<locals>.decorate)Ú
isinstanceÚ
classtypesr   )r   r   r   )r   r   )r   r   Ú	when_type   s   
ÿÿzgeneric.<locals>.when_typec                     s   ‡‡‡ fdd„}|S )z>Decorator to add a method to be called for the given object(s)c                    s:   ˆD ]}ˆ   t|ƒ|| f¡d | urtdˆ|f ƒ‚q| S )Né   z#%r already has method for object %r)r   Úidr   )r   Úo)Ú
_by_objectr   Úobsr   r   r   /   s   
ÿÿz.generic.<locals>.when_object.<locals>.decorater   )r!   r   )r    r   )r!   r   Úwhen_object-   s   zgeneric.<locals>.when_objectc                     sr   ˆ t | d ƒˆƒ}|ˆu r0t| d ƒjD ]}ˆ|ˆƒ}|ˆur(|| i |¤Ž  S qˆ| i |¤ŽS |d | i |¤ŽS )Nr   r   )r   r   r	   )r
   r   r   r   )Ú_gbor   r   r   r   r   Údispatch9   s   
ÿzgeneric.<locals>.dispatchc                    s   t | ƒˆ v S ©N)r   )r   )r    r   r   Ú<lambda>M   s    zgeneric.<locals>.<lambda>c                    s   | ˆ v S r%   r   )r   )r   r   r   r&   N   s    )r   r   Úgetr   Ú__dict__ÚcopyÚ__doc__Ú
__module__r   r"   ÚdefaultÚ
has_objectÚhas_type)r   r   r   r"   r$   r   )r    r   r#   r   r   r   r   r   	   s&   	c                  C   s   dd l } | jd| j| jB d�S )Nr   z
README.txt)Úoptionflags)ÚdoctestÚDocFileSuiteÚELLIPSISÚREPORT_ONLY_FIRST_FAILURE)r0   r   r   r   Ú
test_suiteS   s
   
þr4   Ú__main__)Ú__all__r   r   r   r   r   ÚImportErrorr   r4   r   ÚunittestÚTextTestRunnerÚrÚrunr   r   r   r   Ú<module>   s    þJý