o
    í@Ëa•  ã                   @   sT   d Z ddlmZmZ ddlmZ ddlmZmZ ddddddœZ	G dd„ deƒZ
dS )	zCIterTransformation replaces expressions by iterators when possible.é    )ÚPotentialIteratorÚAliases)ÚTransformation)Úpath_to_attrÚpath_to_nodeN))ÚbuiltinsÚlist)r   Útuple)ÚnumpyZarray)r
   Zasarray)r
   Úcopyc                   @   s(   e Zd ZdZdd„ Zdd„ Zdd„ ZdS )	ÚIterTransformationa	  
    Replaces expressions by iterators when possible.

    >>> import gast as ast
    >>> from pythran import passmanager, backend
    >>> node = ast.parse('''
    ... def foo(l):
    ...     return builtins.sum(l)
    ... def bar(n):
    ...     return foo(builtins.list(n))
    ... ''')
    >>> pm = passmanager.PassManager("test")
    >>> _, node = pm.apply(IterTransformation, node)
    >>> print(pm.dump(backend.Python, node))
    def foo(l):
        return builtins.sum(l)
    def bar(n):
        return foo(n)
    c                 C   s   t  | tt¡ dS )zGather required information.N)r   Ú__init__r   r   )Úself© r   úK/usr/lib/python3/dist-packages/pythran/optimizations/iter_transformation.pyr   '   s   zIterTransformation.__init__c                 C   s4   t  ¡ D ]}t|ƒh}| j|j |kr|  S qdS )zt
        Return matched keyword.

        If the node alias on a correct keyword (and only it), it matches.
        N)ÚEQUIVALENT_ITERATORSÚkeysr   ÚaliasesÚfunc)r   ÚnodeÚpathZcorrect_aliasr   r   r   Úfind_matching_builtin+   s   
ÿþz(IterTransformation.find_matching_builtinc                 C   sp   || j v r3|  |¡}|du r|  |¡S t|jƒdkr|  |¡S t| }|r+t|ƒ|_n|jd }d| _|  |¡S )z@Replace function call by its correct iterator if it is possible.Né   r   T)	Zpotential_iteratorr   Zgeneric_visitÚlenÚargsr   r   r   Úupdate)r   r   Zmatched_pathr   r   r   r   Ú
visit_Call6   s   





zIterTransformation.visit_CallN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r   r   r      s
    r   )r    Zpythran.analysesr   r   Zpythran.passmanagerr   Zpythran.utilsr   r   r   r   r   r   r   r   Ú<module>   s    û	