B
    h^N
                 @   sx   d gZ yddlmZmZ eefZW n ek
r>   eZdZY nX dd  Zdd Ze	dkrtddl
Z
e
 Zee  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                 sR   | d j }xBt|j|tfi jD ] } |}|k	r || |S q W | |S d S )Nr   )	__class__type__name__object__mro__)argskwclstf)_gbt	_sentinelfunc ,lib/python3.7/site-packages/simplegeneric.py	_by_class   s    

zgeneric.<locals>._by_classc                 s:   x$ D ]}t |tstd|f qW  fdd}|S )zADecorator to add a method that will be called for the given typesz%r is not a type or classc                s2   x,D ]$}  || | k	rtd|f qW | 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>   x8D ]0}  t||| fd | k	rtd|f qW | 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                 sl    t | d }|krZxLt| d jD ] }|}|k	r*|| |S q*W | |S n|d | |S d S )Nr   r   )r   r   r	   )r
   r   r   r   )_gbor   r   r   r   r   dispatch9   s    
zgeneric.<locals>.dispatchc                s   t |  kS )N)r   )r   )r    r   r   <lambda>M   s    zgeneric.<locals>.<lambda>c                s   |  kS )Nr   )r   )r   r   r   r%   N   s    )r   r   getr   __dict__copy__doc__
__module__r   r"   defaultZ
has_objectZ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)Zoptionflags)doctestZDocFileSuiteELLIPSISZREPORT_ONLY_FIRST_FAILURE)r,   r   r   r   
test_suiteS   s    r.   __main__)__all__r   r   r   r   r   ImportErrorr   r.   r   ZunittestZTextTestRunnerrrunr   r   r   r   <module>   s   
J