U
    c                     @  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m	Z	 ddl
mZ ddlZddlmZmZ ddlmZ G dd	 d	eZG d
d deZdd ZdS )zp
Test extension array for storing nested data in a pandas container.

The ListArray stores an ndarray of lists.
    )annotationsN)type_t)ExtensionDtype)is_object_dtypeis_string_dtype)ExtensionArrayc                   @  s,   e Zd ZeZdZejZe	ddddZ
dS )	ListDtypelistztype_t[ListArray]returnc                 C  s   t S )zq
        Return the array type associated with this dtype.

        Returns
        -------
        type
        )	ListArray)cls r   E/tmp/pip-unpacked-wheel-g7fro6k3/pandas/tests/extension/list/array.pyconstruct_array_type   s    	zListDtype.construct_array_typeN)__name__
__module____qualname__r	   typenamenpnanna_valueclassmethodr   r   r   r   r   r      s
   r   c                   @  sz   e Zd Ze ZdZdddddZeddd	Zd
d Z	ddddZ
dd ZdddZdd ZdddZedd ZdS )r   i  NFNoner
   c                 C  sT   t |tjstd|D ]0}t || jjst|stdt| jj q|| _	d S )Nz$Need to pass a numpy array as valueszAll values must be of type )

isinstancer   Zndarray	TypeErrordtyper   pdisnastrdata)selfvaluesr   copyvalr   r   r   __init__/   s    zListArray.__init__c                 C  s&   t jt|td}||d d < | |S )Nr   )r   emptylenobject)r   Zscalarsr   r$   r!   r   r   r   _from_sequence7   s    zListArray._from_sequencec                 C  s,   t |tjr| j| S t| | j| S d S N)r   numbersIntegralr!   r   )r"   itemr   r   r   __getitem__=   s    
zListArray.__getitem__intc                 C  s
   t | jS r,   )r)   r!   r"   r   r   r   __len__D   s    zListArray.__len__c                 C  s   t jdd | jD tdS )Nc                 S  s"   g | ]}t |t ot|qS r   )r   r	   r   isnan.0xr   r   r   
<listcomp>I   s     z"ListArray.isna.<locals>.<listcomp>r'   )r   arrayr!   boolr2   r   r   r   r   G   s     zListArray.isnac              
     s   t |}d}|rz d kr"jj |dk  r2tz fdd|D }W q tk
rv } zt||W 5 d }~X Y qX nDzfdd|D }W n, tk
r } zt||W 5 d }~X Y nX |S )NzIIndex is out of bounds or cannot do a non-empty take from an empty array.c                   s"   g | ]}|d krj | n qS )r;   r!   r6   loc
fill_valuer"   r   r   r8   ]   s    z"ListArray.take.<locals>.<listcomp>c                   s   g | ]} j | qS r   r<   r=   r2   r   r   r8   d   s     )r   Zasarrayr   r   any
ValueError
IndexErrorr+   )r"   ZindexerZ
allow_fillr@   msgoutputerrr   r?   r   takeL   s&    

zListArray.takec                 C  s   t | | jd d  S r,   )r   r!   r2   r   r   r   r$   j   s    zListArray.copyTc                 C  sf   t |t| jr*|| jkr*|r&|  S | S t|rTt|sTtjdd | jD |dS tj| j||dS )Nc                 S  s   g | ]}t |qS r   )r    r5   r   r   r   r8   t   s     z$ListArray.astype.<locals>.<listcomp>r'   )r   r$   )	r   r   r   r$   r   r   r   r9   r!   )r"   r   r$   r   r   r   astypem   s    zListArray.astypec                 C  s   t dd |D }| |S )Nc                 S  s   g | ]
}|j qS r   r<   r5   r   r   r   r8   y   s     z/ListArray._concat_same_type.<locals>.<listcomp>)r   Zconcatenate)r   Z	to_concatr!   r   r   r   _concat_same_typew   s    zListArray._concat_same_type)NF)NF)FN)T)r   r   r   r   r   Z__array_priority__r&   r   r+   r0   r3   r   rG   r$   rH   rI   r   r   r   r   r   +   s   


r   c                  C  s,   t jdtd} dd tdD | d d < | S )Nd   r'   c                 S  s&   g | ]}d d t tddD qS )c                 S  s   g | ]}t tjqS r   )randomchoicestringascii_lettersr6   _r   r   r   r8      s     z(make_data.<locals>.<listcomp>.<listcomp>r   
   )rangerK   randintrO   r   r   r   r8      s   zmake_data.<locals>.<listcomp>)r   r(   r*   rR   r<   r   r   r   	make_data}   s
    rT   )__doc__
__future__r   r-   rK   rM   Znumpyr   Zpandas._typingr   Zpandas.core.dtypes.baser   Zpandasr   Zpandas.api.typesr   r   Zpandas.core.arraysr   r   r   rT   r   r   r   r   <module>   s   R