o
    ¹­§iR  ã                   @  sz   U d dl mZ d dlmZ d dlmZ er-d dlmZ d dlm	Z	m
Z
mZ e	eB Zded< G dd	„ d	ƒZG d
d„ dƒZdS )é    )Úannotations)ÚTYPE_CHECKINGN)Ú	TypeAlias)Ú	DataFrameÚ	LazyFrameÚSeriesr   ÚFrameOrSeriesc                   @  s   e Zd ZU dZded< ded< ded< ded< ded< d	ed
< d!dd„Zed"dd„ƒZed#dd„ƒZd$dd„Z	d$dd„Z
d%dd„Zd&dd„Zd S )'ÚPolarsSlicez}
    Apply Python slice object to Polars DataFrame or Series.

    Has full support for negative indexing and/or stride.
    ÚintÚstopÚstartÚstrideÚslice_lengthÚboolÚis_unboundedr   ÚobjÚreturnÚNonec                 C  ó
   || _ d S ©N©r   ©Úselfr   © r   úJ/home/app/Keep/.python/lib/python3.10/site-packages/polars/_utils/slice.pyÚ__init__   ó   
zPolarsSlice.__init__Úlazyr   Úoriginalc                 C  s    |   ¡ }t|tjƒr|S | ¡ S )z.Return lazy variant back to its original type.)ZcollectÚ
isinstanceÚplr   Z	to_series)r   r   Úframer   r   r   Ú_as_original    s   zPolarsSlice._as_originalc                 C  s    t | tjƒr|  ¡  ¡ S |  ¡ S )z2Make lazy to ensure efficient/consistent handling.)r   r    r   Zto_framer   r   r   r   r   Ú_lazify&   s    zPolarsSlice._lazifyc                 C  s   |  | j| j¡ | j¡S )z&Logic for slices with positive stride.)Úslicer   r   Úgather_everyr   r   r   r   r   Ú_slice_positive+   s   zPolarsSlice._slice_positivec                 C  s8   t | jƒ}| | jd | j¡ ¡ }|dkr| |¡S |S )z&Logic for slices with negative stride.é   )Úabsr   r$   r   r   Úreverser%   )r   r   r   Z	lazyslicer   r   r   Ú_slice_negative0   s   
zPolarsSlice._slice_negativeÚsr$   c                 C  sÎ   t | jƒ}t|j|j|jƒ |¡\}}}|dkr"|dko||k| _n|dko+||d k| _| j ¡ r6d| _	n$| jr=|| _	n||ksQ|dkrI||ksQ|dk rS||k rSdnt
|| ƒ| _	|||| _| _| _dS )zENormalise slice bounds, identify unbounded and/or zero-length slices.r'   r   éÿÿÿÿN)Úlenr   r$   r   r   ÚstepÚindicesr   Zis_emptyr   r(   r   )r   r+   Zobj_lenr   r   r   r   r   r   Ú_slice_setup6   s    

ü
ù	zPolarsSlice._slice_setupc                 C  sÜ   |   |¡ | jdkr| j ¡ S | jr&| jdv r&| jdk r!| j ¡ S | j ¡ S | jdkr>| j	dkr>| jdkr>| j 
| j| j¡S | jdk rR| jdkrR| j 
| j	d d¡S |  | j¡}| jdkrb|  |¡n|  |¡}|  || j¡S )zFApply a slice operation, taking advantage of any potential fast paths.r   )r,   r'   r'   )r0   r   r   Úclearr   r   r)   Úcloner   r   r$   r#   r&   r*   r"   )r   r+   ZlazyobjZslicedr   r   r   ÚapplyS   s   




ÿýzPolarsSlice.applyN)r   r   r   r   )r   r   r   r   r   r   )r   r   r   r   )r   r   r   r   )r+   r$   r   r   )r+   r$   r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r   Ústaticmethodr"   r#   r&   r*   r0   r3   r   r   r   r   r	      s"   
 



r	   c                   @  s.   e Zd ZU dZded< ddd„Zdd
d„ZdS )ÚLazyPolarsSlicez¨
    Apply python slice object to Polars LazyFrame.

    Only slices with efficient computation paths that map directly
    to existing lazy methods are supported.
    r   r   r   r   c                 C  r   r   r   r   r   r   r   r   y   r   zLazyPolarsSlice.__init__r+   r$   c                 C  s˜  |j pd}|jp	d}|jr|jdk rd}t|ƒ‚|dk rA|dks%|jdurA||jkrA|d  kr4|kr;n n|jdu sAd}t|ƒ‚|dkrO|jdurO||jksk|dk rp|j durp|jdurp|j|j   kridkrpn n| j ¡ S |j du r¥|jdu r¥|dkrƒ| j ¡ S |dkr| j |¡S |dkr–| j ¡ S |dk r¤| j ¡  t	|ƒ¡S n|d  kr¯|krÐn n|jdu rÐ| j 
|j d ¡ ¡ }t	|ƒdkrÉ|S | t	|ƒ¡S |dkrí|jpØddkrí| j 
|j¡}|dkrè|S | |¡S |dk r|jdu r|dkr| j t	|ƒ¡}|dkr|S | |¡S |dkrB|jdu s"|jdkrB|jdu r*dn|j| }| j ||¡}|dkr=|S | |¡S d|›d}t|ƒ‚)	a  
        Apply a slice operation.

        Note that LazyFrame is designed primarily for efficient computation and does not
        know its own length so, unlike DataFrame, certain slice patterns (such as those
        requiring negative stop/step) may not be supported.
        r   r'   z.negative stop is not supported for lazy slicesNz?negative stride is not supported in conjunction with start+stopr,   zthe given slice zv is not supported by lazy computation

Consider a more efficient approach, or construct explicitly with other methods.)r   r.   r   Ú
ValueErrorr   r1   r2   r%   r)   r(   ÚheadÚtailr$   )r   r+   r   r.   Úmsgr   r   r   r   r   r3   |   sN   

$"0



ÿ"	 "
ÿzLazyPolarsSlice.applyN)r   r   r   r   )r+   r$   r   r   )r4   r5   r6   r7   r8   r   r3   r   r   r   r   r:   o   s
   
 
r:   )Ú
__future__r   Útypingr   Zpolars._reexportZ	_reexportr    r   Zpolarsr   r   r   r   r8   r	   r:   r   r   r   r   Ú<module>   s    `