
    h                        d Z ddlmZ ddlmZmZ ddlZddlm	Z	 ddl
mZ ddlmZ ddlmZ erdd	lmZmZ dd
lmZ ddZ	 	 	 	 	 	 	 	 ddZ	 	 	 	 	 	 ddZddZddZy)z&
EA-compatible analogue to np.putmask
    )annotations)TYPE_CHECKINGAnyN)lib)infer_dtype_from)is_list_like)ExtensionArray)	ArrayLikenpt)
MultiIndexc                   t        | t        j                        rl| j                  t        k(  rt        j                  |      rDt        |t        j                        r[t        j                  |j                  | j                        s1t        |      r t        |      t        |       k(  r	||   | |<   y|| |<   yt        j                  | ||       y)aD  
    ExtensionArray-compatible implementation of np.putmask.  The main
    difference is we do not handle repeating or truncating like numpy.

    Parameters
    ----------
    values: np.ndarray or ExtensionArray
    mask : np.ndarray[bool]
        We assume extract_bool_array has already been called.
    value : Any
    N)
isinstancenpndarraydtypeobjectr   	is_scalarcan_castr   lenputmask)valuesmaskvalues      DD:\jyotish\venv\Lib\site-packages\pandas/core/array_algos/putmask.pyputmask_inplacer      s     vrzz*LLF"3==+? ubjj)"++ekk6<<2X
 3u:V#< ;F4L F4L 	

64'    c                   t        |dd      dk\  r|j                  | j                  d      }|j                         }|dkD  rt	        |      rt        |dd      dk(  rut        j                  |      }||d   k(  rt        j                  | ||       y|j                  d   |d   k(  s|d   dk(  rt        j                  | ||       yt        d      t        j                  | ||       y)	z
    np.putmask will truncate or repeat if `new` is a listlike with
    len(new) != len(values).  We require an exact match.

    Parameters
    ----------
    values : np.ndarray
    mask : np.ndarray[bool]
    new : Any
    ndimr      F)copyz-cannot assign mismatch length to masked arrayN)
getattrastyper   sumr   r   shapeplacer   
ValueError)r   r   newnlocsr%   s        r   putmask_without_repeatr*   >   s     sFA!#jjEj2 HHJEqy\#&73+Ba+G E"I HHVT3'ZZ^uRy(E"INJJvtS)LMM


64%r   c                    t        |      }|j                  | j                  k7  rt        d      |j                          }||fS )zG
    Validate mask and check if this putmask operation is a no-op.
    z,putmask: mask and data must be the same size)extract_bool_arrayr%   r'   any)r   r   noops      r   validate_putmaskr/   e   sA     d#DzzV\\!GHHxxz>D:r   c                    t        | t              r| j                  t        d      } t	        j
                  | t              } | S )zP
    If we have a SparseArray or BooleanArray, convert it to ndarray[bool].
    F)r   na_value)r   )r   r	   to_numpyboolr   asarray)r   s    r   r,   r,   s   s7     $' }}4%}8::d$'DKr   c                    | j                   t        k(  rBt        |      \  }}t        j                  |d      rt        |      s|g|z  }|S t        |      }|S )z
    Parameters
    ----------
    values : np.ndarray
    num_set : int
        For putmask, this is mask.sum()
    other : Any
    mM)r   r   r   r   is_np_dtyper   list)r   num_setotherr   _s        r   setitem_datetimelike_compatr<      sY     ||v#E*q??5$'  &') L ULr   )r   r
   r   npt.NDArray[np.bool_]r   r   returnNone)r   
np.ndarrayr   r=   r(   r   r>   r?   )r   zArrayLike | MultiIndexr   r@   r>   z"tuple[npt.NDArray[np.bool_], bool])r   r
   r>   r=   )r   r@   r9   int)__doc__
__future__r   typingr   r   numpyr   pandas._libsr   pandas.core.dtypes.castr   pandas.core.dtypes.commonr   pandas.core.arraysr	   pandas._typingr
   r   pandasr   r   r*   r/   r,   r<    r   r   <module>rM      s    #
   4 2 -
 "(B$&$&3$&:=$&	$&N"*4'r   