Ë
    7^(h4  ã                   ó\   — d Z ddlmZ ddlmZ efd„Zd„ Zefd„Zd„ Zd	„ Z	d
„ Z
efd„Zd„ Zy)zP Generic Rules for SymPy

This file assumes knowledge of Basic and little else.
é    )Úsifté   )Únewc                 ó   ‡ ‡— ˆ ˆfd„}|S )aÄ   Create a rule to remove identities.

    isid - fn :: x -> Bool  --- whether or not this element is an identity.

    Examples
    ========

    >>> from sympy.strategies import rm_id
    >>> from sympy import Basic, S
    >>> remove_zeros = rm_id(lambda x: x==0)
    >>> remove_zeros(Basic(S(1), S(0), S(2)))
    Basic(1, 2)
    >>> remove_zeros(Basic(S(0), S(0))) # If only identities then we keep one
    Basic(0)

    See Also:
        unpack
    c           	      óV  •— t        t        ‰| j                  «      «      }t        |«      dk(  r| S t        |«      t	        |«      k7  r= ‰| j
                  gt        | j                  |«      D ��cg c]
  \  }}|rŒ	|‘Œ c}}¢­Ž S  ‰| j
                  | j                  d   «      S c c}}w )z Remove identities r   )ÚlistÚmapÚargsÚsumÚlenÚ	__class__Úzip)ÚexprÚidsÚargÚxÚisidr   s       €€úQ/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/sympy/strategies/rl.pyÚident_removezrm_id.<locals>.ident_remove   s“   ø€ ä”3�t˜TŸY™YÓ'Ó(ˆÜˆs‹8�qŠ=ØˆKÜ�‹Xœ˜S›Ò!Ù�t—~‘~ð JÜ+.¨t¯y©y¸#Ó+>×H¡  aÂašÓHòJð Jñ �t—~‘~ t§y¡y°¡|Ó4Ð4ùó Is   Á/
B%Á:B%© )r   r   r   s   `` r   Úrm_idr   
   s   ù€ õ&	5ð Ðó    c                 ó   ‡ ‡‡— ˆˆˆ fd„}|S )a6   Create a rule to conglomerate identical args.

    Examples
    ========

    >>> from sympy.strategies import glom
    >>> from sympy import Add
    >>> from sympy.abc import x

    >>> key     = lambda x: x.as_coeff_Mul()[1]
    >>> count   = lambda x: x.as_coeff_Mul()[0]
    >>> combine = lambda cnt, arg: cnt * arg
    >>> rl = glom(key, count, combine)

    >>> rl(Add(x, -x, 3*x, 2, 3, evaluate=False))
    3*x + 5

    Wait, how are key, count and combine supposed to work?

    >>> key(2*x)
    x
    >>> count(2*x)
    2
    >>> combine(2, x)
    2*x
    c                 óv  •— t        | j                  ‰
«      }|j                  «       D ��ci c]  \  }}|t        t	        ‰	|«      «      “Œ }}}|j                  «       D ��cg c]  \  }} ‰||«      ‘Œ }}}t        |«      t        | j                  «      k7  rt        t        | «      g|¢­Ž S | S c c}}w c c}}w )z2 Conglomerate together identical args x + x -> 2x )r   r
   Úitemsr   r	   Úsetr   Útype)r   ÚgroupsÚkr
   ÚcountsÚmatÚcntÚnewargsÚcombineÚcountÚkeys           €€€r   Úconglomeratezglom.<locals>.conglomerateF   s›   ø€ ä�d—i‘i Ó%ˆØ:@¿,¹,».×I©w¨q°$�!”Sœ˜U DÓ)Ó*Ñ*ÐIˆÑIØ5;·\±\³^×D©¨¨c‘7˜3 Õ$ÐDˆÑDÜˆw‹<œ3˜tŸy™y›>Ò)Ü”t˜D“zÐ, GÒ,Ð,àˆKùó JùÛDs   « B/Á!B5r   )r&   r%   r$   r'   s   ``` r   Úglomr(   +   s   ú€ ö6ð Ðr   c                 ó   ‡ ‡— ˆ ˆfd„}|S )zï Create a rule to sort by a key function.

    Examples
    ========

    >>> from sympy.strategies import sort
    >>> from sympy import Basic, S
    >>> sort_rl = sort(str)
    >>> sort_rl(Basic(S(3), S(1), S(2)))
    Basic(1, 2, 3)
    c                 óT   •—  ‰| j                   gt        | j                  ‰¬«      ¢­Ž S )N)r&   )r   Úsortedr
   )r   r&   r   s    €€r   Úsort_rlzsort.<locals>.sort_rl`   s"   ø€ Ù�4—>‘>Ð?¤F¨4¯9©9¸#Ô$>Ò?Ð?r   r   )r&   r   r,   s   `` r   Úsortr-   S   s   ù€ õ@à€Nr   c                 ó   ‡ ‡— ˆ ˆfd„}|S )aW   Turns an A containing Bs into a B of As

    where A, B are container types

    >>> from sympy.strategies import distribute
    >>> from sympy import Add, Mul, symbols
    >>> x, y = symbols('x,y')
    >>> dist = distribute(Mul, Add)
    >>> expr = Mul(2, x+y, evaluate=False)
    >>> expr
    2*(x + y)
    >>> dist(expr)
    2*x + 2*y
    c           
      ó  •— t        | j                  «      D ]j  \  }}t        |‰«      sŒ| j                  d | | j                  |   | j                  |dz   d  }}} ‰|j                  D �cg c]  } ‰||fz   |z   Ž ‘Œ c}Ž c S  | S c c}w )Nr   )Ú	enumerater
   Ú
isinstance)r   Úir   ÚfirstÚbÚtailÚAÚBs         €€r   Údistribute_rlz!distribute.<locals>.distribute_rlu   s�   ø€ Ü §	¡	Ó*ò 	K‰FˆAˆsÜ˜#˜qÕ!Ø!%§¡¨2¨A °·	±	¸!±¸d¿i¹iÈÈAÉÈÐ>O˜$�q�ÙÀ!Ç&Á&ÖI¸3™1˜u¨ v™~°Ñ4Ò6ÒIÐJÒJð	Kð ˆùò Js   Á*B
r   )r6   r7   r8   s   `` r   Ú
distributer9   e   s   ù€ õ ð Ðr   c                 ó   ‡ ‡— ˆ ˆfd„}|S )z Replace expressions exactly c                 ó   •— | ‰k(  r‰S | S )Nr   )r   Úar4   s    €€r   Úsubs_rlzsubs.<locals>.subs_rl€   s   ø€ Ø�1Š9ØˆHàˆKr   r   )r<   r4   r=   s   `` r   Úsubsr>   ~   s   ù€ õð
 €Nr   c                 óT   — t        | j                  «      dk(  r| j                  d   S | S )z• Rule to unpack singleton args

    >>> from sympy.strategies import unpack
    >>> from sympy import Basic, S
    >>> unpack(Basic(S(2)))
    2
    r   r   )r   r
   ©r   s    r   ÚunpackrA   ‰   s'   € ô ˆ4�9‰9ƒ~˜ÒØ�y‰y˜‰|Ðàˆr   c                 óÞ   — | j                   }g }| j                  D ]>  }|j                   |k(  r|j                  |j                  «       Œ.|j                  |«       Œ@  || j                   g|¢­Ž S )z9 Flatten T(a, b, T(c, d), T2(e)) to T(a, b, c, d, T2(e)) )r   r
   ÚextendÚappend)r   r   Úclsr
   r   s        r   ÚflattenrF   —   sa   € à
�.‰.€CØ€DØ�y‰yò ˆØ�=‰=˜CÒØ�K‰K˜Ÿ™Õ!à�K‰K˜Õð	ñ
 ˆt�~‰~Ð% Ò%Ð%r   c                 ó~   — | j                   r| S  | j                  t        t        t        | j
                  «      «      Ž S )zç Rebuild a SymPy tree.

    Explanation
    ===========

    This function recursively calls constructors in the expression tree.
    This forces canonicalization and removes ugliness introduced by the use of
    Basic.__new__
    )Úis_AtomÚfuncr   r	   Úrebuildr
   r@   s    r   rJ   rJ   £   s1   € ð ‡|‚|Øˆàˆt�y‰yœ$œs¤7¨D¯I©IÓ6Ó7Ð8Ð8r   N)Ú__doc__Úsympy.utilities.iterablesr   Úutilr   r   r(   r-   r9   r>   rA   rF   rJ   r   r   r   ú<module>rN      sK   ðñõ +Ý ð ó òB%ðP ó ò$ò2òð ó 	&ó9r   