o
    @a0                     @   s`   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlZG dd	 d	eZdS )
zH Comprehension patterns transforms list comprehension into intrinsics.      )OptimizableComprehension)Transformation)ConvertToTuple)mangle)attr_to_pathpath_to_attrNc                   @   s@   e Zd ZdZdd Zdd Zdd Zdd	 Zd
d Zdd Z	dS )ComprehensionPatternsa\  
    Transforms list comprehension into intrinsics.
    >>> import gast as ast
    >>> from pythran import passmanager, backend
    >>> node = ast.parse("def foo(y) : return (x for x in y)")
    >>> pm = passmanager.PassManager("test")
    >>> _, node = pm.apply(ComprehensionPatterns, node)
    >>> 'map' in pm.dump(backend.Python, node)
    True

    >>> node = ast.parse("def foo(y) : return [0 for _ in builtins.range(y)]")
    >>> _, node = pm.apply(ComprehensionPatterns, node)
    >>> print(pm.dump(backend.Python, node))
    def foo(y):
        return ([0] * builtins.len(builtins.range(y)))
    c                 C   s   t | t d S N)r   __init__r   self r   N/usr/lib/python3/dist-packages/pythran/optimizations/comprehension_patterns.pyr
      s   zComprehensionPatterns.__init__c                 C   sH   d| _ | | | j r"tjdtdd}tj|gd}|jd| |S )NF	itertools)nameasname)namesr   )use_itertoolsgeneric_visitastaliasr   ZImportbodyinsert)r   nodeZimport_aliasZimportItr   r   r   visit_Module"   s   
z"ComprehensionPatterns.visit_Modulec                 C   s   |j rMttt|jjt d d gg d g g d g t|j dkr*t	t
 |j n|j d }tjtjdt d d ddt d}t|||jgg S |jS )N   r   builtinsidctx
annotationtype_commentfiltervalueattrr   )ifsr   Lambda	argumentsNametargetr   ParamlenZBoolOpZAnd	AttributeLoadCalliter)r   genZldFilterZifilterNamer   r   r   make_Iterator,   s(   z#ComprehensionPatterns.make_Iteratorc              	      s,  | j v rd _ |  fdd|jD }dd |jD }t|dkr8|d }t|d gg d g g d g }nKd _tjtj	t
dt d d dd	t d
}|d j}dd t|D }	t||	|j|_t||g }tt	|t d d gg d g g d g }|j}
t||
}|||S  |S )NTc                    s   g | ]}  |qS r   )r2   .0r1   r   r   r   
<listcomp>C   s    z3ComprehensionPatterns.visitComp.<locals>.<listcomp>c                 S   s$   g | ]}t |jjt  d d qS r	   )r   r)   r*   r   r+   r3   r   r   r   r5   D   s    r   r   r   r   productr#   c                 S   s   i | ]	\}}|j |fqS r   )r   )r4   ivr   r   r   
<dictcomp>U   s    z3ComprehensionPatterns.visitComp.<locals>.<dictcomp>)Zoptimizable_comprehensionupdater   
generatorsr,   r   r(   r   r-   r)   r   r.   r   	enumerater   Zvisiteltr/   r+   r'   )r   r   Z	make_attrZitersZ	variablesZiterASTZvarASTZprodNameZvaridZ	renamingsZ	ldBodymapZldmapr   r   r   	visitComp=   sB   






zComprehensionPatterns.visitCompc              	   C   s   dd }t |jtjrat|jdkra|jd }|jsat |jtjraz6t	|jj
d }d}||krVt|jjdkrVd| _tt|jgt t ttd|jgg W S W n	 ty`   Y nw | ||S )Nc               
   W   sj   t jt jdt  d d ddt  d}t |t| g }t t t dt  d d dt  |gg }|S )Nr   r   mapr#   list)r   r-   r)   r.   r/   r@   )argsrr   r   r   makeattre   s"   z6ComprehensionPatterns.visit_ListComp.<locals>.makeattrr   r   )Zpythonicr   ZfunctorrangeT)r   r,   )
isinstancer=   r   ZConstantr,   r;   r&   r0   r/   r   funcrA   r:   ZBinOpZListr.   ZMultr   	TypeErrorr>   )r   r   rC   r1   pathZ
range_pathr   r   r   visit_ListCompd   s,   

z$ComprehensionPatterns.visit_ListCompc                 C   s   dd }|  ||S )Nc               	   W   s4   t t jt jdt  d d ddt  dt| g S )Nr   r   r?   r#   )r   r/   r-   r)   r.   r@   )rA   r   r   r   rC      s   z:ComprehensionPatterns.visit_GeneratorExp.<locals>.makeattr)r>   )r   r   rC   r   r   r   visit_GeneratorExp   s   z(ComprehensionPatterns.visit_GeneratorExpN)
__name__
__module____qualname____doc__r
   r   r2   r>   rI   rJ   r   r   r   r   r      s    
'"r   )rN   Zpythran.analysesr   Zpythran.passmanagerr   Z(pythran.transformations.normalize_tuplesr   Zpythran.conversionr   Zpythran.utilsr   r   Zgastr   r   r   r   r   r   <module>   s   