U
    f/e                     @  s   d Z ddlmZ ddlZddlZddlZddlZddlZ	ddl
mZ ddlZddlmZmZmZmZ ddlmZ ddlmZ eG dd	 d	eZeG d
d deZG dd deeZG dd deZG dd deZdS )a  
Rudimentary Apache Arrow-backed ExtensionArray.

At the moment, just a boolean array / type is implemented.
Eventually, we'll want to parametrize the type and support
multiple dtypes. Not all methods are implemented yet, and the
current implementation is not efficient.
    )annotationsN)type_t)ExtensionArrayExtensionDtyperegister_extension_dtypetake)	is_scalar)OpsMixinc                   @  sD   e Zd ZejZdZdZej	Z
eddddZedddd	Zd
S )ArrowBoolDtypebZ
arrow_boolztype_t[ArrowBoolArray]returnc                 C  s   t S zq
        Return the array type associated with this dtype.

        Returns
        -------
        type
        )ArrowBoolArraycls r   G/tmp/pip-unpacked-wheel-tiezk1ph/pandas/tests/extension/arrow/arrays.pyconstruct_array_type'   s    	z#ArrowBoolDtype.construct_array_typeboolc                 C  s   dS )NTr   selfr   r   r   _is_boolean2   s    zArrowBoolDtype._is_booleanN)__name__
__module____qualname__npbool_typekindnamepaNULLna_valueclassmethodr   propertyr   r   r   r   r   r
      s   
r
   c                   @  s0   e Zd ZeZdZdZejZ	e
ddddZdS )ArrowStringDtypeUZarrow_stringztype_t[ArrowStringArray]r   c                 C  s   t S r   )ArrowStringArrayr   r   r   r   r   ?   s    	z%ArrowStringDtype.construct_array_typeN)r   r   r   strr   r   r    r!   r"   r#   r$   r   r   r   r   r   r&   7   s   r&   c                      s   e Zd ZU ded< edd Zedd Zed3d	d
Zdd Zdd Z	dd Z
d4 fdd	Zedd Zdd Zdd ZeddddZdd Zd5d d!Zd"d# Zed$d% Zd&d' Zdd(d)d*d+d,d-Zd6d/d0Zd7d1d2Z  ZS )8ArrowExtensionArrayzpa.ChunkedArray_datac                 C  s    t t t|g}| |S N)r!   chunked_arrayarrayr   Zasarray)r   valuesarrr   r   r   from_scalarsN   s    z ArrowExtensionArray.from_scalarsc                 C  s    t |tjst| t|gS r,   )
isinstancer!   ArrayAssertionErrorr-   )r   r0   r   r   r   
from_arrayS   s    zArrowExtensionArray.from_arrayNFc                 C  s
   |  |S r,   )r1   )r   Zscalarsdtypecopyr   r   r   _from_sequenceX   s    z"ArrowExtensionArray._from_sequencec                 C  s   t | j dt| j dS )N())r   r   reprr+   r   r   r   r   __repr__\   s    zArrowExtensionArray.__repr__c                 C  s6   t |r| j | S | j | }t| |S d S r,   )r   r+   	to_pandasr   r1   )r   itemvalsr   r   r   __getitem___   s    zArrowExtensionArray.__getitem__c                 C  s
   t | jS r,   )lenr+   r   r   r   r   __len__f   s    zArrowExtensionArray.__len__Tc                   s8   t |t| jr*|| jkr*|r&|  S | S t ||S r,   )r2   r   r6   r7   superastype)r   r6   r7   	__class__r   r   rD   i   s
    zArrowExtensionArray.astypec                 C  s   | j S r,   )_dtyper   r   r   r   r6   q   s    zArrowExtensionArray.dtypec              	   C  sT   t |t| st |t| jt|j}tttj|t	
| j dgS )N)mask)r2   r   NotImplementedErrorr   r.   r+   r   r!   r-   pdisnar=   )r   otheropresultr   r   r   _logical_methodu   s     z#ArrowExtensionArray._logical_methodc                 C  s    t |t| sdS | |tjS )NF)r2   r   rO   operatoreq)r   rL   r   r   r   __eq__~   s    zArrowExtensionArray.__eq__intr   c                 C  s   t dd | jjD S )Nc                 s  s*   | ]"}|  D ]}|d k	r|jV  qqd S r,   )bufferssize).0chunkxr   r   r   	<genexpr>   s
   
 z-ArrowExtensionArray.nbytes.<locals>.<genexpr>)sumr+   chunksr   r   r   r   nbytes   s    zArrowExtensionArray.nbytesc                 C  s   t | j }t| |S r,   )rJ   rK   r+   r=   r   r1   )r   Znasr   r   r   rK      s    zArrowExtensionArray.isnac                 C  s>   | j  }|r|d kr| jj}t||||d}| j|| jdS )N)
fill_value
allow_fill)r6   )r+   r=   r6   r#   r   r8   )r   indicesr^   r]   datarN   r   r   r   r      s
    
zArrowExtensionArray.takec                 C  s   t | t| jS r,   )r   r7   r+   r   r   r   r   r7      s    zArrowExtensionArray.copyc                 C  s,   t tjdd |D }t|}| |S )Nc                 s  s   | ]}|j jV  qd S r,   )r+   r[   )rV   rX   r   r   r   rY      s     z8ArrowExtensionArray._concat_same_type.<locals>.<genexpr>)list	itertoolschainfrom_iterabler!   r-   )r   Z	to_concatr[   r0   r   r   r   _concat_same_type   s    
z%ArrowExtensionArray._concat_same_typec                 C  s   t | | j  S r,   )r   r1   r+   r=   r   r   r   r   
__invert__   s    zArrowExtensionArray.__invert__)skipnar)   r   )r    rg   c             
   K  sZ   |r| |     }n| }zt||}W n( tk
rN } z
t|W 5 d }~X Y nX |f |S r,   )rK   getattrAttributeError	TypeError)r   r    rg   kwargsr0   rM   errr   r   r   _reduce   s    zArrowExtensionArray._reducer   c                 C  s   t | j  S r,   )r   r+   r=   anyr   Zaxisoutr   r   r   rn      s    zArrowExtensionArray.anyc                 C  s   t | j  S r,   )r   r+   r=   allro   r   r   r   rq      s    zArrowExtensionArray.all)NF)T)FN)r   N)r   N)r   r   r   __annotations__r$   r1   r5   r8   r<   r@   rB   rD   r%   r6   rO   rR   r\   rK   r   r7   re   rf   rm   rn   rq   __classcell__r   r   rE   r   r*   K   s4   



	
	

r*   c                   @  s   e Zd Zdd ZdS )r   c                 C  s4   t |tjst|jt ks"t|| _t | _	d S r,   )
r2   r!   ChunkedArray
ValueErrorr   r   r4   r+   r
   rG   r   r/   r   r   r   __init__   s
    zArrowBoolArray.__init__Nr   r   r   rw   r   r   r   r   r      s   r   c                   @  s   e Zd Zdd ZdS )r(   c                 C  s4   t |tjst|jt ks"t|| _t | _	d S r,   )
r2   r!   rt   ru   r   stringr4   r+   r&   rG   rv   r   r   r   rw      s
    zArrowStringArray.__init__Nrx   r   r   r   r   r(      s   r(   )__doc__
__future__r   r7   rb   rP   Znumpyr   Zpyarrowr!   Zpandas._typingr   ZpandasrJ   Zpandas.api.extensionsr   r   r   r   Zpandas.api.typesr   Zpandas.core.arrayliker	   r
   r&   r*   r   r(   r   r   r   r   <module>   s$   p
