
    -e,                    ,   U d Z ddlmZ ddlZ ej        e          ZddlZddlZddl	m
Z
 ddlmZ ddlmZmZmZmZmZ ddlZddlmZ dd	lmZ erdd
lmZ ddlmZ dZddZeg df         Zded<   eg ed         f         Zded<   eeef         Z ded<   eed         ee!e                  ee"eef                  f         Z#ded<   eg df         Z$ded<   e"ee$f         Z%ded<   e"e e&e         f         Z'ded<    G d d          Z( G d d          Z)dS )z$ Internal utils related to Tornado

    )annotationsN)defaultdict)format_exception)TYPE_CHECKINGAny	AwaitableCallableUnion)gen   )ID)IOLoop)	TypeAlias returnNonec                 ,   t           j        dk    r}t           j        d d         dk    rgt          j        dk     rYdd l} t          |                                           | j        u r/|                     | 	                                           d S d S d S d S d S )Nwin32   )r      r   )      r   )
sysplatformversion_infotornadoasynciotypeget_event_loop_policyWindowsProactorEventLoopPolicyset_event_loop_policyWindowsSelectorEventLoopPolicy)r   s    2lib/python3.11/site-packages/bokeh/util/tornado.pyfixup_windows_event_loop_policyr$   >   s    RaR I-- 6))--//00G4ZZZ ))'*P*P*R*RSSSSS 	 --)) [Z    r   CallbackSyncCallbackAsyncCallbackInvokeResultRemoverRemoversRemoversByCallablec                  \    e Zd ZU dZded<   ded<   ded<   ded<   ddZddZddZddZdS )_AsyncPeriodicz Like ioloop.PeriodicCallback except the 'func' can be async and return
    a Future.

    Will wait for func to finish each time before we call it again. (Plain
    ioloop.PeriodicCallback can "pile up" invocations if they are taking too
    long.)

    r   _loopint_periodbool_started_stoppedfuncr(   periodio_loopr   r   c                L    || _         || _        || _        d| _        d| _        d S )NF)_funcr/   r1   r3   r4   )selfr5   r6   r7   s       r#   __init__z_AsyncPeriodic.__init__i   s)    #

r%   gen.Future[None]c                z    t          j                    | j                            | j        dz  fd           S )N     @@c                 .                          d           S N)
set_result)fs   r#   <lambda>z&_AsyncPeriodic.sleep.<locals>.<lambda>u   s    Q\\$=O=O r%   )r   Futurer/   
call_laterr1   )r:   rB   s    @r#   sleepz_AsyncPeriodic.sleeps   s<    !jll
dlV35O5O5O5OPPPr%   c                      j         rt          d          d _         d
 fdd fd	 j                                                                        d S )Nz&called start() twice on _AsyncPeriodicTr   r)   c                                                      }                                 }|| S t          j        |          }t          j        | |g          S r@   )rF   r9   r   convert_yieldedmulti)sleep_futureresultcallback_futurer:   s      r#   invokez$_AsyncPeriodic.start.<locals>.invoke}   sO      ::<<LZZ\\F~##!1&99O9lO<===r%   futurer<   r   c                P   j         s#j                                                    |                                 }|dt                              d           t          |j        ||j                  }t                              d	                    |                     d S d S )Nz$Error thrown from periodic callback: )
r4   r/   
add_future	exceptionlogerrorr   	__class____traceback__join)rO   exlinesrN   on_doner:   s      r#   r[   z%_AsyncPeriodic.start.<locals>.on_done   s    = 9
%%ffhh888!!##B~		@AAA(r2;KLL		"''%..))))) ~r%   )r   r)   )rO   r<   r   r   )r3   RuntimeErrorr/   rR   rF   )r:   rN   r[   s   `@@r#   startz_AsyncPeriodic.startx   s    = 	IGHHH
	> 
	> 
	> 
	> 
	> 
	>	* 	* 	* 	* 	* 	* 	* 	* 	
djjllG44444r%   c                    d| _         d S NT)r4   )r:   s    r#   stopz_AsyncPeriodic.stop   s    r%   N)r5   r(   r6   r0   r7   r   r   r   )r   r<   r   r   )	__name__
__module____qualname____doc____annotations__r;   rF   r]   r`   r   r%   r#   r.   r.   Z   s           MMMLLLNNNNNN      
5 5 5 5:     r%   r.   c                      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
ed<   d&dZd'dZd(dZd)dZd*dZ	d+dZ
d,dZd-d Zd,d!Zd.d#Zd,d$Zd%S )/_CallbackGroupz^ A collection of callbacks added to a Tornado IOLoop that can be removed
    as a group.

    r+   _next_tick_callback_removers_timeout_callback_removers_periodic_callback_removersr,   _next_tick_removers_by_callable_timeout_removers_by_callable_periodic_removers_by_callabler   r/   r7   r   r   c                   || _         i | _        i | _        i | _        t	          j                    | _        t          t                    | _	        t          t                    | _
        t          t                    | _        d S r@   )r/   ri   rj   rk   	threadingLock_removers_lockr   setrl   rm   rn   )r:   r7   s     r#   r;   z_CallbackGroup.__init__   si    
 -/)*,'+-('n../:3/?/?,-8-=-=*.9#.>.>+++r%   c                   t          | j                  D ]}|                     |           t          | j                  D ]}|                     |           t          | j                  D ]}|                     |           dS )z, Removes all registered callbacks.

        N)listri   remove_next_tick_callbackrj   remove_timeout_callbackrk   remove_periodic_callback)r:   cb_ids     r#   remove_all_callbacksz#_CallbackGroup.remove_all_callbacks   s     $;<< 	2 	2E**51111$9:: 	0 	0E((////$:;; 	1 	1E))%0000	1 	1r%   removersc                    || j         u r| j        S || j        u r| j        S || j        u r| j        S t          d|          )NzUnhandled removers)ri   rl   rj   rm   rk   rn   r\   )r:   r{   s     r#   _get_removers_ids_by_callablez,_CallbackGroup._get_removers_ids_by_callable   sX    t8887788855999663X>>>r%   callbackr(   callback_idr   removerr*   c                v    | j         5  ||v rt          d          |||<   d d d            d S # 1 swxY w Y   d S )Nz?A callback of the same type has already been added with this ID)rr   
ValueError)r:   r~   r   r{   r   s        r#   _assign_removerz_CallbackGroup._assign_remover   s      	, 	,h&& !bccc$+H[!	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   .22c                   	 | j         5  |                    |          }t          |                     |                                                    D ]C\  }}	 |                    |           |s|                     |          |= 4# t          $ r Y @w xY w	 d d d            n# 1 swxY w Y   n# t          $ r t          d          w xY w |             d S )Nz:Removing a callback twice (or after it's already been run))rr   popru   r}   itemsremoveKeyErrorr   )r:   r   r{   r   cbcb_idss         r#   _execute_removerz_CallbackGroup._execute_remover   sH   	[$  ",,{33"&t'I'I('S'S'Y'Y'['["\"\  JBk222% Q $ B B8 L LR P#                   	[ 	[ 	[YZZZ	[					sS   B0 AB$-BB$
BB$BB$B0 $B((B0 +B(,B0 0C
c                     d fdd_         dfd}                      j        |            j                                       S )	zu Adds a callback to be run on the nex

        The passed-in ID can be used with remove_next_tick_callback.

        r   None | Awaitable[None]c                 T    j         rd S                                              S r@   )removedrv   )r~   r   r:   wrappers   r#   r   z6_CallbackGroup.add_next_tick_callback.<locals>.wrapper   s4      t**;7778::r%   Fr   c                     d _         d S r_   )r   )r   s   r#   r   z6_CallbackGroup.add_next_tick_callback.<locals>.remover   s    "GOOOr%   )r   r   ra   )r   r   ri   r/   add_callback)r:   r~   r   r   r   s   ``` @r#   add_next_tick_callbackz%_CallbackGroup.add_next_tick_callback   s    		 		 		 		 		 		 		 		 		  	# 	# 	# 	# 	# 	# 	X{D4UW^___
(((r%   c                <    |                      || j                   dS )z@ Removes a callback added with add_next_tick_callback.

        N)r   ri   r:   r   s     r#   rv   z(_CallbackGroup.remove_next_tick_callback   s#     	k4+LMMMMMr%   r&   timeout_millisecondsr0   c                     d fd}dd fd}                       j        |            j                            |dz  |          S )z Adds a callback to be run once after timeout_milliseconds.

        The passed-in ID can be used with remove_timeout_callback.

        r   r   c                 B                                                  S r@   )rw   )r~   r   r:   s   r#   r   z4_CallbackGroup.add_timeout_callback.<locals>.wrapper  s#    ((5558::r%   Nc                 D     j                                         d S d S r@   )r/   remove_timeout)handler:   s   r#   r   z4_CallbackGroup.add_timeout_callback.<locals>.remover  s-    !
))&11111 "!r%   r>   ra   )r   rj   r/   rE   )r:   r~   r   r   r   r   r   s   `` `  @r#   add_timeout_callbackz#_CallbackGroup.add_timeout_callback  s    	 	 	 	 	 	 	 	 !%	2 	2 	2 	2 	2 	2 	2 	X{D4SU\]]]&&';f'DgNNr%   c                <    |                      || j                   dS )zN Removes a callback added with add_timeout_callback, before it runs.

        N)r   rj   r   s     r#   rw   z&_CallbackGroup.remove_timeout_callback  s#     	k4+JKKKKKr%   period_millisecondsc                    t          ||| j                  }|                     ||| j        |j                   |                                 dS )z Adds a callback to be run every period_milliseconds until it is removed.

        The passed-in ID can be used with remove_periodic_callback.

        )r7   N)r.   r/   r   rk   r`   r]   )r:   r~   r   r   r   s        r#   add_periodic_callbackz$_CallbackGroup.add_periodic_callback  sM     H&94:NNNX{D4TVXV]^^^





r%   c                <    |                      || j                   dS )z? Removes a callback added with add_periodic_callback.

        N)r   rk   r   s     r#   rx   z'_CallbackGroup.remove_periodic_callback%  s#     	k4+KLLLLLr%   N)r7   r   r   r   ra   )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   )r   r   r   r   )r~   r&   r   r0   r   r   r   r   )r~   r(   r   r0   r   r   r   r   )rb   rc   rd   re   rf   r;   rz   r}   r   r   r   rv   r   rw   r   rx   r   r%   r#   rh   rh      s]         
 +***(((())))777755556666MMM? ? ? ?1 1 1 1? ? ? ?, , , ,      4N N N N   (L L L L   M M M M M Mr%   rh   ra   )*re   
__future__r   logging	getLoggerrb   rT   r   rp   collectionsr   	tracebackr   typingr   r   r   r	   r
   r   r   
core.typesr   tornado.ioloopr   typing_extensionsr   __all__r$   r&   rf   r'   r(   ru   dictr)   r*   r+   rs   r,   r.   rh   r   r%   r#   <module>r      s     # " " " " " g!! 


     # # # # # # & & & & & &                           ,%%%%%%++++++ 
T 
T 
T 
T  #2t8, , , , ,#B	$$78 8 8 8 8L-78 8 8 8 8	$491EyQUVY[^V^Q_G` `a a a a ab$h' ' ' ' '2w;' ' ' ' ' $Xs2w%6 7  7 7 7 7< < < < < < < <|QM QM QM QM QM QM QM QM QM QMr%   