U
    Þ@·fÇ
  ã                   @   sb   d Z dd„ Zdd„ Zdd„ Zddd	„Zd
d„ Zdd„ Zdd„ Zdd„ Zdd„ Z	dd„ Z
dd„ ZdS )z& Generic SymPy-Independent Strategies c                 c   s
   | V  d S ©N© )Úxr   r   ú@/tmp/pip-unpacked-wheel-6uje5nh9/sympy/strategies/branch/core.pyÚidentity   s    r   c                    s   ‡ ‡fdd„‰ˆS )z: Apply a branching rule repeatedly until it has no effect c                 3   sH   | h}ˆ | ƒD ]$}||kr|  |¡ ˆ|ƒE d H  q|| hkrD| V  d S r   )Úadd)ÚexprÚseenÚnexpr©ÚbruleÚexhaust_brlr   r   r   
   s    

zexhaust.<locals>.exhaust_brlr   ©r   r   r
   r   Úexhaust   s    r   c                    s   ‡ ‡fdd„}|S )Nc                 3   s,   ˆ | ƒD ]}|| kr ˆˆ | |ƒ |V  qd S r   r   )r   Úresult©r   Úfnr   r   Úonaction_brl   s    zonaction.<locals>.onaction_brlr   )r   r   r   r   r   r   Úonaction   s    r   Nc                    s*   ˆ sddl m} |‰ ‡ fdd„}t| |ƒS )zA Print the input and output expressions at each rule application é    )Ústdoutc                    s&   ˆ   d| j ¡ ˆ   d||f ¡ d S )Nz	Rule: %s
zIn: %s
Out: %s

)ÚwriteÚ__name__)Úbrlr   r   ©Úfiler   r   r   $   s    zdebug.<locals>.write)Úsysr   r   )r   r   r   r   r   r   r   Údebug   s
    r   c                     s   ‡ fdd„}|S )z) Multiplex many branching rules into one c                 3   s:   t ƒ }ˆ D ]*}|| ƒD ]}||kr| |¡ |V  qq
d S r   )Úsetr   )r   r   r   r	   ©Úbrulesr   r   Úmultiplex_brl-   s    
z multiplex.<locals>.multiplex_brlr   )r   r    r   r   r   Ú	multiplex+   s    r!   c                    s   ‡ ‡fdd„}|S )z0 Only apply branching rule if condition is true c                 3   s   ˆ| ƒrˆ | ƒE d H  n d S r   r   ©r   ©r   Úcondr   r   Úconditioned_brl9   s    z"condition.<locals>.conditioned_brlr   )r$   r   r%   r   r#   r   Ú	condition7   s    r&   c                    s   ‡ ‡fdd„}|S )z6 Yield only those results which satisfy the predicate c                 3   s   t ˆˆ | ƒƒE d H  d S r   )Úfilterr"   ©r   Úpredr   r   Úfiltered_brlC   s    zsfilter.<locals>.filtered_brlr   )r)   r   r*   r   r(   r   ÚsfilterA   s    r+   c                    s   ‡ fdd„}|S )Nc                 3   s*   d}ˆ | ƒD ]}d}|V  q|s&| V  d S ©NFTr   )r   Úyieldedr	   r   r   r   Únotempty_brlI   s    znotempty.<locals>.notempty_brlr   )r   r.   r   r   r   ÚnotemptyH   s    r/   c                     s   ‡ fdd„}|S )z$ Execute one of the branching rules c                 3   s4   d}ˆ D ]&}|| ƒD ]}d}|V  q|r d S qd S r,   r   )r   r-   r   r	   r   r   r   Ú
do_one_brlU   s    zdo_one.<locals>.do_one_brlr   )r   r0   r   r   r   Údo_oneS   s    r1   c                     s   ‡ fdd„}|S )zR
    Compose a sequence of brules so that they apply to the expr sequentially
    c                 3   sH   ˆ s| V  d S ˆ d ˆ dd …  }}|| ƒD ]}t |Ž |ƒE d H  q,d S )Nr   é   )Úchain)r   ÚheadÚtailr	   r   r   r   Ú	chain_brld   s    zchain.<locals>.chain_brlr   )r   r6   r   r   r   r3   `   s    	r3   c                    s   ‡ fdd„}|S )z# Turn a rule into a branching rule c                 3   s   ˆ | ƒV  d S r   r   r"   ©Úrlr   r   r   r   s    zyieldify.<locals>.brlr   )r8   r   r   r7   r   Úyieldifyp   s    r9   )N)Ú__doc__r   r   r   r   r!   r&   r+   r/   r1   r3   r9   r   r   r   r   Ú<module>   s   	

