U
    c                     @  s   d Z ddlmZ ddlmZmZmZ ddlZddl	m
Z
mZ ddlmZmZ ddlmZ ddlmZ erdd	lmZ dd
lmZ edddZedddZddddddddZdddddddddZG dd deZG dd deZdS ) z?
Shared methods for Index subclasses backed by ExtensionArray.
    )annotations)TYPE_CHECKINGCallableTypeVarN)	ArrayLikenpt)cache_readonlydoc)ABCDataFrame)Index)IntervalArray)NDArrayBackedExtensionArray_TNDArrayBackedExtensionIndex)bound_ExtensionIndexTExtensionIndexFstrtypebool)namedelegatecachewrapc                   s   t | t ts"t jdkr~|rJfdd}|_ j|_t|}qfdd}fdd}|_ j|_t||}n*t s }n fdd	}|_ j|_|S )
a  
    Make an alias for a method of the underlying ExtensionArray.

    Parameters
    ----------
    name : str
        Name of an attribute the class should inherit from its EA parent.
    delegate : class
    cache : bool, default False
        Whether to convert wrapped properties into cache_readonly
    wrap : bool, default False
        Whether to wrap the inherited result in an Index.

    Returns
    -------
    attribute, method, property, or cache_readonly
    Zgetset_descriptorc                   s   t | j S N)getattr_dataselfr    A/tmp/pip-unpacked-wheel-g7fro6k3/pandas/core/indexes/extension.pycached=   s    z"_inherit_from_data.<locals>.cachedc                   sZ   t | j }rVt|t| jr4t| j|| jdS t|trH|| S t|| jdS |S )Nr   )	r   r   
isinstancer   _simple_newr   r
   	set_indexr   r   result)r   r   r    r!   fgetF   s    

z _inherit_from_data.<locals>.fgetc                   s   t | j | d S r   )setattrr   r   valuer   r    r!   fsetP   s    z _inherit_from_data.<locals>.fsetc                   s|   d|krt dt| j  | jf||}rxt|t| jrVt| j|| jdS t|trj|| S t	|| jdS |S )NZinplacezcannot use inplace with r   )

ValueErrorr   __name__r   r#   r$   r   r
   r%   r   )r   argskwargsr'   )attrr   r    r!   method_   s    

z"_inherit_from_data.<locals>.method)r   r#   propertyr   r.   __doc__r   callable)r   r   r   r   r"   r2   r(   r,   r    )r1   r   r   r!   _inherit_from_data#   s$    


r6   z	list[str]z:Callable[[type[_ExtensionIndexT]], type[_ExtensionIndexT]])namesr   r   r   returnc                   s   ddd fdd}|S )a  
    Class decorator to pin attributes from an ExtensionArray to a Index subclass.

    Parameters
    ----------
    names : List[str]
    delegate : class
    cache : bool, default False
    wrap : bool, default False
        Whether to wrap the inherited result in an Index.
    ztype[_ExtensionIndexT])clsr8   c                   s*   D ] }t | d}t| || q| S )N)r   r   )r6   r)   )r9   r   methr   r   r7   r   r    r!   wrapper   s    zinherit_names.<locals>.wrapperr    )r7   r   r   r   r<   r    r;   r!   inherit_namesq   s    r=   c                   @  sH   e Zd ZU dZded< dd ZeejdddZe	d	d
ddZ
dS )r   z>
    Index subclass for indexes backed by ExtensionArray.
    z+IntervalArray | NDArrayBackedExtensionArrayr   c                 C  s   | j |S )zE
        Convert value to be insertable to underlying array.
        )r   Z_validate_setitem_valuer*   r    r    r!   _validate_fill_value   s    z#ExtensionIndex._validate_fill_valueNc                 C  s^   z4|| }t |tjrt|}t |ts0td|W S  tk
rX   | t| Y S X d S )Nz,The map function must return an Index object)	r#   npZndarrayr   	TypeError	ExceptionZastypeobjectmap)r   ZmapperZ	na_actionr'   r    r    r!   rC      s    
zExtensionIndex.mapznpt.NDArray[np.bool_]r8   c                 C  s
   | j  S r   )r   Zisnar   r    r    r!   _isnan   s    zExtensionIndex._isnan)N)r.   
__module____qualname__r4   __annotations__r>   r	   r   rC   r   rE   r    r    r    r!   r      s   
c                   @  s8   e Zd ZU dZded< ddddZddd	d
dZdS )r   zK
    Index subclass for indexes backed by NDArrayBackedExtensionArray.
    r   r   z
np.ndarrayrD   c                 C  s   | j jS r   )r   _ndarrayr   r    r    r!   _get_engine_target   s    z.NDArrayBackedExtensionIndex._get_engine_targetr   )r'   r8   c                 C  s    |j | jjj kst| j|S r   )Zdtyper   rI   AssertionErrorZ_from_backing_datar&   r    r    r!   _from_join_target   s    z-NDArrayBackedExtensionIndex._from_join_targetN)r.   rF   rG   r4   rH   rJ   rL   r    r    r    r!   r      s   
)FF)FF)r4   
__future__r   typingr   r   r   Znumpyr?   Zpandas._typingr   r   Zpandas.util._decoratorsr   r	   Zpandas.core.dtypes.genericr
   Zpandas.core.indexes.baser   Zpandas.core.arraysr   Zpandas.core.arrays._mixinsr   r   r   r6   r=   r   r   r    r    r    r!   <module>   s(      O   *