
    Cj%                        S SK Jr  S SKrS SKJr  S SKJr  S SKr\R                  R                  SS9 " S S5      5       rg)	    )annotationsN)ceil)	monotonicT)angularc                      \ rS rSrSr S     SS jjrSS jr\SS j5       r\SS j5       r	SS jr
SS jrSS	 jrSS
 jr\SS j5       rSS jrSrg)ETA
   z-Calculate speed and estimate time to arrival.c                :    Xl         X l        S/U l        SU l        g)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      ]/home/rurouni/.local/share/pipx/venvs/strix-agent/lib/python3.13/site-packages/textual/eta.py__init__ETA.__init__   s      "314><    c              #  f   #    SU R                   4v   SU R                  [        5       5      4v   g 7f)Nspeedeta)r   get_etar   r   s    r   __rich_repr__ETA.__rich_repr__   s*     tzz!!T\\)+...s   /1c                P    U R                   (       d   S5       eU R                   S   $ )zFirst sample.Assumes samples not emptyr   r   r   s    r   first_sampleETA.first_sample    s%     }}999}}}Qr   c                P    U R                   (       d   S5       eU R                   S   $ )zLast sample.r   r   r   s    r   last_sampleETA.last_sample&   s%     }}999}}}R  r   c                "    U R                   SS2	 g)z)Start ETA calculations from current time.Nr   r   s    r   reset	ETA.reset,   s    MM!r   c                   U R                   (       a#  U R                  S   U:  a  U R                  5         U R                   R                  X45        U =R                  S-  sl        U R                  S-  S:X  a  U R                  5         gg)zxAdd 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_sampleETA.add_sample0   sh     ==T--a08;JJLd-.1??S A%KKM &r   c                    [        U R                  5      S::  a  gU R                  S   S   U R                  -
  n[        R                  " U R                  US45      nU R                  SU2	 g)zPrune old samples.r	   Nr#   r   )lenr   r   bisectbisect_left)r   
prune_timeindexs      r   r-   
ETA._prune@   s^    t}}#]]2&q)D,B,BB
""4==:q/BMM&5&!r   c                ,   [         R                  " U R                  US45      nU[        U R                  5      :  a  U R                  $ US:X  a  U R
                  $ U R                  US-
     u  p4U R                  U   u  pVX-
  XS-
  -  nXFU-
  U-  -   nX4$ )z$Get the progress at a specific time.r   r*   )r4   r5   r   r3   r$   r    )	r   r.   r7   time1	progress1time2	progress2factorintermediate_progresss	            r   _get_progress_atETA._get_progress_atI   s     ""4==4)<C&&###A:$$$==3==/,5=1 )-Bf,L L**r   c                    [        U R                  5      S:  a  gU R                  u  pU R                  XR                  -
  5      u  p4X-
  S:  a  gX-
  nX$-
  nU(       a  Xe-  nU$ SnU$ )z:The current speed, or `None` if it couldn't be calculated.   Nr*   r   )r3   r   r$   r@   r   )r   recent_sample_timer=   progress_start_timer;   
time_deltadistancer   s           r   r   	ETA.speedX   s     t}}!(,(8(8%)-)>)>!7!77*
& 3a7'=
()3% :;r   c                    U R                   nU(       d  gU R                  u  p4SU-
  nUS::  a  g[        U R                  X-
  5      nX&-  n[	        SXW-
  U-  5      n[        U5      $ )ziEstimated 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   ETA.get_etal   st     

'+'7'7$/)	>   4 4d6HI$8#	8EABCyr   )r   r   r   r   N)<      )r   floatr   rT   returnNone)rU   zrich.repr.Result)rU   tuple[float, float])rU   rV   )r.   rT   r/   rT   rU   rV   )r.   rT   rU   rW   )rU   zfloat | None)r.   rT   rU   z
int | None)__name__
__module____qualname____firstlineno____doc__r   r   propertyr    r$   r'   r0   r-   r@   r   r   __static_attributes__ r   r   r   r   
   s    7 JL!&AF	/    
 ! !
 "+  &r   r   )
__future__r   r4   mathr   r.   r   	rich.reprrichreprautor   r_   r   r   <module>rf      s?    "     v v vr   