
    h                     D    d dl Z d dlmZ  G d de      Z G d de      Zy)    N)IBatchedTimerc                   "    e Zd ZdZd Zd Zd Zy)_BatchedCallz
    Wraps IDelayedCall-implementing objects, implementing only the API
    which txaio promised in the first place: .cancel

    Do not create these yourself; use _BatchedTimer.call_later()
    c                 .    || _         || _        || _        y N)_timer_index_call)selftimerindexthe_calls       I/var/www/Befach/backend/env/lib/python3.12/site-packages/txaio/_common.py__init__z_BatchedCall.__init__'   s    
    c                 ^    | j                   j                  | j                  |        d | _         y r   )r   _remove_callr	   r   s    r   cancelz_BatchedCall.cancel-   s!      d3r   c                 "    | j                         S r   )r
   r   s    r   __call__z_BatchedCall.__call__1   s    zz|r   N)__name__
__module____qualname____doc__r   r   r    r   r   r   r      s    r   r   c                   ,    e Zd ZdZ	 ddZd Zd Zd Zy)_BatchedTimera=  
    Internal helper.

    Instances of this are returned from
    :meth:`txaio.make_batched_timer` and that is the only way they
    should be instantiated. You may depend on methods from the
    interface class only (:class:`txaio.IBatchedTimer`)

    **NOTE** that the times are in milliseconds in this class!
    Nc                     |dk  rt        d      t        |      | _        || _        || _        || _        t               | _        || _        y )N        z!bucket_milliseconds must be > 0.0)	
ValueErrorfloat_bucket_milliseconds_chunk_size_get_seconds_create_delayed_calldict_buckets_loop)r   bucket_milliseconds
chunk_sizeseconds_providerdelayed_call_creatorloops         r   r   z_BatchedTimer.__init__A   sN     #%@AA$)*=$>!%,$8!
r   c                    | j                         }t        ||z         dz  }|t        || j                  z        z  }t        | |fd      }	 | j                  |   d   j                  |       |S # t        $ rE |dz  |z
  }| j                  t        d|      | j                  |      }	|	|gf| j                  |<   Y |S w xY w)z#
        IBatchedTimer API
        i  c                        i S r   r   )argsfunckwargss   r   <lambda>z*_BatchedTimer.call_later.<locals>.<lambda>Z   s    T45J65Jr           @@r    )
r%   intr#   r   r(   appendKeyErrorr&   max_notify_bucket)
r   delayr2   r1   r3   now	real_timecalldiffdelayed_calls
     ```     r   
call_laterz_BatchedTimer.call_laterR   s    
 !e$t+	ST%>%>>??	D)-JK	>MM)$Q'..t4   	>&#-D  44C##L
 )5tf'=DMM)$	>s   !A6 6A
CCc                      j                   |   \  }} j                   |= g  fd j                  t        j                  t	        t        |             j                  z        z  } | j                  t        d|             y)z
        Internal helper. This 'does' the callbacks in a particular bucket.

        :param real_time: the bucket to do callbacks on
        c                    | d | D ]
  }	  |         | |d  } | rj                  |dz  | ||       y t              r(d}D ]  }|dj	                  |      z  } t        |      y # t         $ r}j                  |       Y d }~d }~ww xY w)Nr6   z'Error(s) processing call_later bucket:
z{}
)	Exceptionr8   r&   lenformatRuntimeError)	callsr+   chunk_delay_msr?   emsgerrorsnotify_one_chunkr   s	         r   rN   z6_BatchedTimer._notify_bucket.<locals>.notify_one_chunku   s    kz*%F +
 *+&E))"V+$" v;DC#v}}Q// $&s++	  ! %MM!$$%s   A((	B1BBr    N)r(   r#   mathceilr"   rF   r$   r:   )r   r>   rA   rI   delay_msrM   rN   s   `    @@r   r;   z_BatchedTimer._notify_bucketk   s}     !%i 8uMM)$	,2 ,,tyy#e* 0 000
 

 	 0 0#c82DEr   c                     	 | j                   |   \  }}|j                  |       |s| j                   |= |j                          yy# t        $ r Y yw xY w)z
        Internal helper. Removes a (possibly still pending) call from a
        bucket. It is *not* an error of the bucket is gone (e.g. the
        call has already happened).
        N)r(   r9   remover   )r   r>   r?   rA   rI   s        r   r   z_BatchedTimer._remove_call   s\    	$(MM)$<!\5 	Ti(!   		s   A 	AAr   )r   r   r   r   r   rB   r;   r   r   r   r   r   r   5   s"    	" "2(FT"r   r   )rO   txaio.interfacesr   objectr   r   r   r   r   <module>rV      s'   6  *6 ,p"M p"r   