
    AHj%                        d dl mZ d dlZd dlmZ d dlmZ d dlZej                  j                  d       G d d             Zy)	    )annotationsN)ceil)	monotonicT)angularc                      e Zd ZdZ	 d	 	 	 	 	 ddZddZedd       Zedd       ZddZ	ddZ
ddZdd	Zedd
       ZddZy)ETAz-Calculate speed and estimate time to arrival.c                >    || _         || _        dg| _        d| _        y)zCreate an ETA.

        Args:
            estimation_period: Period in seconds, used to calculate speed.
            extrapolate_period: Maximum number of seconds used to estimate progress after last sample.
        )        r
   r   N)estimation_periodmax_extrapolate_samples
_add_count)selfr   extrapolate_periods      C/root/tools/cai/cai_env/lib/python3.12/site-packages/textual/eta.py__init__zETA.__init__   s$     "314><    c              #  f   K   d| j                   f d| j                  t                     f y w)Nspeedeta)r   get_etar   r   s    r   __rich_repr__zETA.__rich_repr__   s+     tzz!!T\\)+...s   /1c                F    | j                   sJ d       | j                   d   S )zFirst sample.Assumes samples not emptyr   r   r   s    r   first_samplezETA.first_sample    s%     }}999}}}Qr   c                F    | j                   sJ d       | j                   d   S )zLast sample.r   r   r   s    r   last_samplezETA.last_sample&   s%     }}999}}}R  r   c                "    | j                   dd= y)z)Start ETA calculations from current time.Nr   r   s    r   resetz	ETA.reset,   s    MM!r   c                
   | j                   r"| j                  d   |kD  r| j                          | j                   j                  ||f       | xj                  dz  c_        | j                  dz  dk(  r| j                          yy)zAdd a new sample.

        Args:
            time: Time when sample occurred.
            progress: Progress ratio (0 is start, 1 is complete).
           d   r   N)r   r    r"   appendr   _prune)r   timeprogresss      r   
add_samplezETA.add_sample0   sj     ==T--a08;JJLdH-.1??S A%KKM &r   c                    t        | j                        dk  ry| j                  d   d   | j                  z
  }t        j                  | j                  |df      }| j                  d|= y)zPrune old samples.
   Nr   r   )lenr   r   bisectbisect_left)r   
prune_timeindexs      r   r'   z
ETA._prune@   s^    t}}#]]2&q)D,B,BB
""4==:q/BMM&5&!r   c                2   t        j                  | j                  |df      }|t        | j                        k\  r| j                  S |dk(  r| j
                  S | j                  |dz
     \  }}| j                  |   \  }}||z
  ||z
  z  }|||z
  |z  z   }||fS )z$Get the progress at a specific time.r   r$   )r.   r/   r   r-   r    r   )	r   r(   r1   time1	progress1time2	progress2factorintermediate_progresss	            r   _get_progress_atzETA._get_progress_atI   s     ""4==4)<C&&###A:$$$==3y==/y,55=1 )Y-Bf,L L***r   c                    t        | j                        dk  ry| j                  \  }}| j                  || j                  z
        \  }}||z
  dk  ry||z
  }||z
  }|r||z  }|S d}|S )z:The current speed, or `None` if it couldn't be calculated.   Nr$   r   )r-   r   r    r9   r   )r   recent_sample_timer6   progress_start_timer4   
time_deltadistancer   s           r   r   z	ETA.speedX   s     t}}!(,(8(8%I)-)>)>!7!77*
&Y  33a7'*==
y()3:% :;r   c                    | j                   }|sy| j                  \  }}d|z
  }|dk  ryt        | j                  ||z
        }||z  }t	        d||z
  |z        }t        |      S )zEstimated seconds until completion, or `None` if no estimate can be made.

        Args:
            time: Current time.
        Ng      ?r   )r   r    minr   maxr   )	r   r(   r   recent_timerecent_progress	remainingtime_since_sampleextrapolate_progressr   s	            r   r   zETA.get_etal   s~     

'+'7'7$_/)	>   4 4d[6HI$'88#	$88EABCyr   N)<      )r   floatr   rJ   returnNone)rK   zrich.repr.Result)rK   tuple[float, float])rK   rL   )r(   rJ   r)   rJ   rK   rL   )r(   rJ   rK   rM   )rK   zfloat | None)r(   rJ   rK   z
int | None)__name__
__module____qualname____doc__r   r   propertyr   r    r"   r*   r'   r9   r   r    r   r   r   r   
   s    7 JL!&AF	/    
 ! !
 "+  &r   r   )
__future__r   r.   mathr   r(   r   	rich.reprrichreprautor   rS   r   r   <module>rZ      s?    "     v v vr   