U
    L?hว
  ใ                   @   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   ๚N/var/www/html/venv/lib/python3.8/site-packages/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   	

