U
    L?h.                     @   s    d dl mZ dd Zdd ZdS )    wrapsc                    s   |   fdd}|S )a  
    Memo decorator for sequences defined by recurrence

    Examples
    ========

    >>> from sympy.utilities.memoization import recurrence_memo
    >>> @recurrence_memo([1]) # 0! = 1
    ... def factorial(n, prev):
    ...     return n * prev[-1]
    >>> factorial(4)
    24
    >>> factorial(3) # use cache values
    6
    >>> factorial.cache_length() # cache length can be obtained
    5
    >>> factorial.fetch_item(slice(2, 4))
    [2, 6]

    c                    s6   t   fdd}fdd|_fdd|_|S )Nc                    sD   t  }| |k r |  S t|| d D ]} |  q& d S )N   lenrangeappend)nLi)cachef M/var/www/html/venv/lib/python3.8/site-packages/sympy/utilities/memoization.pyg   s    z-recurrence_memo.<locals>.decorator.<locals>.gc                      s   t  S N)r   r   r   r   r   <lambda>$       z4recurrence_memo.<locals>.decorator.<locals>.<lambda>c                    s    |  S r   r   )xr   r   r   r   %   r   )r   Zcache_lengthZ
fetch_itemr   r   r   r   r   	decorator   s
    z"recurrence_memo.<locals>.decoratorr   )initialr   r   r   r   recurrence_memo   s    r   c                    s   g  fdd}|S )z
    Memo decorator for associated sequences defined by recurrence starting from base

    base_seq(n) -- callable to get base sequence elements

    XXX works only for Pn0 = base_seq(0) cases
    XXX works only for m <= n cases
    c                    s   t   fdd}|S )Nc                    s~   t }| |k r|  | S t|| d D ]F} |}|g}| td|d D ]}||}|| qTq*|  | S )Nr   r   )r
   mr   r   ZF_i0Z	F_i_cachejZF_ij)base_seqr   r   r   r   r   7   s    
z3assoc_recurrence_memo.<locals>.decorator.<locals>.gr   r   r   r   r   r   r   6   s    z(assoc_recurrence_memo.<locals>.decoratorr   )r   r   r   r   r   assoc_recurrence_memo*   s    
r    N)	functoolsr   r   r    r   r   r   r   <module>   s   &