o
    @af                     @   sD   d Z ddlmZ ddlmZ ddlmZ ddlZG dd deZ	dS )z?
PotentialIterator finds if it is possible to use an iterator.
    )Aliases)ArgumentReadOnce)NodeAnalysisNc                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )PotentialIteratorz<Find whether an expression can be replaced with an iterator.c                 C   s   t  | _t| tt d S N)setresultr   __init__r   r   self r   E/usr/lib/python3/dist-packages/pythran/analyses/potential_iterator.pyr	      s   zPotentialIterator.__init__c                 C   s   | j |j | | d S r   )r   additergeneric_visitr   noder   r   r   	visit_For   s   zPotentialIterator.visit_Forc                 C   s4   t |jd tjtjfr| j|j | | d S )Nr   )	
isinstanceopsastZInZNotInr   updatecomparatorsr   r   r   r   r   visit_Compare   s   zPotentialIterator.visit_Comparec                    sZ   t |jD ] \ }fddt fddj|j D r%j| q| d S )Nc                    s   |  j v o j |  | dkS )N   )Zargument_read_once)fir
   r   r   
isReadOnce   s   
z0PotentialIterator.visit_Call.<locals>.isReadOncec                 3   s    | ]}| V  qd S r   r   ).0alias)r   r   r   r   	<genexpr>!   s    z/PotentialIterator.visit_Call.<locals>.<genexpr>)	enumerateargsallaliasesfuncr   r   r   )r   r   argr   )r   r   r   r   
visit_Call   s    zPotentialIterator.visit_CallN)__name__
__module____qualname____doc__r	   r   r   r'   r   r   r   r   r      s    r   )
r+   Zpythran.analyses.aliasesr   Z#pythran.analyses.argument_read_oncer   Zpythran.passmanagerr   Zgastr   r   r   r   r   r   <module>   s    