
    ^h]                        % S r SSKJr  SSKJr  SSKJr  SSKJrJ	r	J
r
  SSKJrJrJrJrJr  SSKJr  S	S
/r\" S\\S4   S9r\    SS j5       rSrS\S'   \" S5      r " S S5      r\4     SS jjrg)z&
Implementation for async generators.
    )annotations)get_running_loop)asynccontextmanager)EmptyFullQueue)AnyAsyncGeneratorCallableIterableTypeVar   )run_in_executor_with_contextaclosinggenerator_to_async_generator_T_GeneratorN)boundc                  #     U 7v   U R                  5       I Sh  vN   g N! U R                  5       I Sh  vN    f = f7f)z1Similar to `contextlib.aclosing`, in Python 3.10.N)aclose)things    b/home/james-whalen/.local/lib/python3.13/site-packages/prompt_toolkit/eventloop/async_generator.pyr   r      s-     
llnellns(   A$ A"A?;?Ai  intDEFAULT_BUFFER_SIZE_Tc                      \ rS rSrSrg)_Done1    N)__name__
__module____qualname____firstlineno____static_attributes__r       r   r   r   1   s    r$   r   c               p  ^ ^^#    Sm[        US9m[        5       nSU UU4S jjn[        U5      n   TR                  5       n[        U[        5      (       a  OU7v   M.  SmUI Sh  vN   g! [         a(    UR                  STR                  5      I Sh  vN  n N[f = f N:! SmUI Sh  vN    f = f7f)aA  
Turn a generator or iterable into an async generator.

This works by running the generator in a background thread.

:param get_iterable: Function that returns a generator or iterable when
    called.
:param buffer_size: Size of the queue between the async consumer and the
    synchronous generator that produces items.
F)maxsizec                 >  >  T" 5        H8  n T(       a      TR                  [        5       SS9  g  TR                  U SS9  M:       TR                  [        5       SS9  g! [         a    T(       a   g Mb  f = f! [         aB    T(       a7       TR                  [        5       SS9  g! [         a    T(       a   g M1  f = f M  f = f! [         a    T(       a   g M  f = f!   TR                  [        5       SS9  f ! [         a    T(       a      g M3  f = f= f)zf
Consume the generator in background thread.
When items are received, they'll be pushed to the queue.
r   )timeoutN)putr   r   )itemget_iterableqquittings    r   runner,generator_to_async_generator.<locals>.runnerH   sA   
	$  EE%'1E- ' dA.  '" EE%'1E-      !#" EE%'1E-    !!   EE%'1E-   s   C$ A! C$ A;C$ C
 !A87A8;CC$ B) )C ?C C$ CC$ 
C! C!$D'D ?D DDDDDTN)returnNone)	r   r   r   
get_nowaitr   run_in_executorget
isinstancer   )r+   buffer_sizeloopr.   runner_fr*   r,   r-   s   `     @@r   r   r   5   s      H 5AD D ,F3H?||~ $&&
     ?!11$>>>? 		  si   +B6B$ A- B$  B6'B"(B6-)BBBB$ BB$ "B6$B3,B/-B33B6)r   r   r0   z"AsyncGenerator[_T_Generator, None])r+   zCallable[[], Iterable[_T]]r6   r   r0   zAsyncGenerator[_T, None])__doc__
__future__r   asyncior   
contextlibr   queuer   r   r   typingr	   r
   r   r   r   utilsr   __all__r   r   r   __annotations__r   r   r   r   r$   r   <module>rB      s    # $ * $ $ C C / "
 ~^CI-FG ' *   S T]	 	 +H,HH Hr$   