B
      \Y  γ               @   s$  d Z ddlmZ eddddd Zdd	 Ze Zd
d fddZedddd Zedddd Zedddd Z	edddd Z
edddd Zdd fddZedddd Zedddd Zdd fd d!Zd"d fd#d$Zd%d fd&d'Zd(d fd)d*Zd+d fd,d-Zd.S )/zh
Usecases of recursive functions.

Some functions are compiled at import time, hence a separate module.
ι    )Ϊjitzi8(i8)T)Ϊnopythonc             C   s&   | dk r| S t | d t | d d S )Nι   ι   )Ϊn)Ϊfib1)r   © r   ϊ=lib/python3.7/site-packages/numba/tests/recursion_usecases.pyr   
   s    r   c                  s   t ddd fdd  S )Nzi8(i8)T)r   c                s&   | dk r| S  | d  | d d S )Nr   r   )r   r   )r   )Ϊfib2r   r	   r
      s    zmake_fib2.<locals>.fib2)r   r   r   )r
   r	   Ϊ	make_fib2   s    r   c             C   s   | S )Nr   )Ϊxr   r   r	   Ϊ<lambda>   s    r   c                s   |  fdd  S )Nc                s*   | dkr"|dkr"|  | | | S |S d S )Nr   r   r   )r   Ϊy)Ϊtype_change_selfr   r	   r      s    z/make_type_change_self.<locals>.type_change_selfr   )r   r   )r   r	   Ϊmake_type_change_self   s    r   c             C   s$   | dk r| S t | d t | d  S )Nr   r   )Ϊfib3)r   r   r   r	   r   )   s    r   c             C   s   t | S )N)Ϊrunaway_self)r   r   r   r	   r   1   s    r   c             C   s.   | dkrt dn| dkr&t| d S dS d S )Nr   Ϊ
raise_selfr   )Ϊ
ValueErrorr   )r   r   r   r	   r   6   s
    
r   c             C   s   | dk rdS | t | d  S )Nr   )Ϊ	inner_fac)r   r   r   r	   Ϊ	outer_facA   s    r   c             C   s   | dk rdS | t | d  S )Nr   )r   )r   r   r   r	   r   H   s    r   c             C   s   | S )Nr   )r   r   r   r	   r   P   s    c                s(   |  fdd| fdd  fS )Nc                s    | dkrd d| d S d|  S )Nr   r   r   )Ϊzr   r   )r   )Ϊbarr   r	   ΪfooQ   s    zmake_mutual2.<locals>.fooc                s    | | dS )N)r   r   )r   r   )r   r   r	   r   W   s    zmake_mutual2.<locals>.barr   )r   r   )r   r   r	   Ϊmake_mutual2P   s    r   c             C   s   t | S )N)Ϊrunaway_mutual_inner)r   r   r   r	   Ϊrunaway_mutual`   s    r   c             C   s   t | S )N)r   )r   r   r   r	   r   e   s    r   c             C   s   | S )Nr   )r   r   r   r	   r   l   s    c                s$   |  fdd| fdd S )Nc                s*   | dkr"|dkr"|  | | | S |S d S )Nr   r   r   )r   r   )r   r   r	   r   m   s    z$make_type_change_mutual.<locals>.fooc                s*   | dkr"|dkr"|  | | | S |S d S )Nr   r   r   )r   r   )r   r   r	   r   w   s    z$make_type_change_mutual.<locals>.barr   )r   r   )r   r   r	   Ϊmake_type_change_mutuall   s    
r   c             C   s   | S )Nr   )r   r   r   r	   r      s    c                sD   | fdd | fdd| fdd|  fdd S )	Nc                s   | dkr | d S dS d S )Nr   r   r   r   )r   )Ϊsecondr   r	   Ϊfirst   s    zmake_four_level.<locals>.firstc                s    | d S )Nι   r   )r   )Ϊthirdr   r	   r      s    zmake_four_level.<locals>.secondc                s    | d S )Nι   r   )r   )Ϊfourthr   r	   r!      s    zmake_four_level.<locals>.thirdc                s    | d d S )Nr   r   r   )r   )r   r   r	   r#      s    zmake_four_level.<locals>.fourthr   )r   r   )r   r#   r   r!   r	   Ϊmake_four_level   s
    r$   c             C   s   | S )Nr   )r   r   r   r	   r      s    c                s2   | fdd|  fdd| dd  S )Nc                s   | dkr | S dS d S )Nr   r   r   )r   )Ϊinnerr   r	   Ϊouter   s    zmake_inner_error.<locals>.outerc                s    | dkr| d S  | S d S )Nr   r   r   )r   )Ϊ	error_funr&   r   r	   r%   £   s    zmake_inner_error.<locals>.innerc             S   s   | j S )N)Ϊndim)r   r   r   r	   r'   «   s    z#make_inner_error.<locals>.error_funr   )r   r   )r'   r%   r&   r	   Ϊmake_inner_error   s    r)   c             C   s   | S )Nr   )r   r   r   r	   r   ³   s    c                s$   |  fdd| fdd S )Nc                s   | dkr | S dS d S )Nr   r   r   )r   )r%   r   r	   r&   ΄   s    z make_raise_mutual.<locals>.outerc                s.   | dkrt dn| dkr& | d S dS d S )Nr   Zraise_mutualr   )r   )r   )r&   r   r	   r%   »   s
    
z make_raise_mutual.<locals>.innerr   )r   r   )r%   r&   r	   Ϊmake_raise_mutual³   s    	r*   c             C   s   | S )Nr   )r   r   r   r	   r   Η   s    c                s"   | dd |  fdd  S )Nc             S   s   | dkr| d S d S d S )Nι   r   r   )r   r   r   r	   r   Θ   s    z&make_optional_return_case.<locals>.fooc                s0   | }|d kr|S |dk r |S |  | S d S )Nι   r   )r   Ϊout)r   r   r   r	   r   Ο   s    z&make_optional_return_case.<locals>.barr   )r   r   )r   r   r	   Ϊmake_optional_return_caseΗ   s    
r.   N)Ϊ__doc__Znumbar   r   r   r
   r   r   r   r   r   r   r   r   r   r   r$   r)   r*   r.   r   r   r   r	   Ϊ<module>   s$   	