
    f                        S r SSKrSSKrSSKrSSKJrJrJrJrJ	r	J
r
  SSKrSSKJr  \R                  rSS jrSS jrS\4S	 jr\R&                  " \5      rS
\SS4S jrS
\SS4S jr " S S\5      rSS jr " S S5      rS\4S jrg)u   
asyncio.py

asyncio compatibility layer for pyfuse3

Copyright © 2018 Nikolaus Rath <Nikolaus.org>
Copyright © 2018 JustAnotherArchivist

This file is part of pyfuse3. This work may be distributed under
the terms of the GNU LGPL.
    N)AnyCallableIterableOptionalSetType   )FileHandleTreturnc                  X    [         R                  S   n X l        X l        U [        l        g)zSwitch pyfuse3 to asyncio mode.zpyfuse3.asyncioN)sysmoduleslowlevelfrom_threadpyfuse3trio)	fake_trios    1/usr/lib/python3/dist-packages/pyfuse3/asyncio.pyenabler      s&     -.I"%GL    c                  <    [         R                  S   [        l        g)z&Switch pyfuse3 to default (trio) mode.r   N)r   r   r   r    r   r   disabler   !   s     ;;v&GLr   c                      g)Nasyncior   r   r   r   current_trio_tokenr   '   s    r   fdc                   ^ ^#    [         R                  " 5       n[        T    R                  U5         [         R                  " 5       mTR                  T UR                  S 5        UR                  U U4S j5        UI S h  vN   [        T    R                  U5        [        T    (       d  [        T 	 g g  N3! [        T    R                  U5        [        T    (       d  [        T 	 f f = f7f)Nc                 &   > TR                  T5      $ N)remove_reader)fr   loops    r   <lambda>wait_readable.<locals>.<lambda>4   s    4+=+=b+Ar   )	r   Future_read_futuresaddget_event_loop
add_reader
set_resultadd_done_callbackremove)r   futurer#   s   ` @r   wait_readabler/   .   s     $+NN$4F"&!"%%'F--t4  !ABb  (R b! ! 	b  (R b! !s/   .C)AB6  B4B6 /C)4B6 60C&&C)c                 V    [         U     H  nUR                  [        5       5        M     g r    )r'   set_exceptionClosedResourceError)r   r"   s     r   notify_closingr3   <   s!    2	+-. r   c                       \ rS rSrSrg)r2   A   r   N)__name__
__module____qualname____firstlineno____static_attributes__r   r   r   r2   r2   A   s    r   r2   c                      [         R                  S:  a  [        R                  R	                  5       $ [        R                  " 5       $ N)      )r   version_infor   Taskcurrent_taskr   r   r   rA   rA   E   s2    
& ||((**##%%r   c            	           \ rS rSrSS jrSS.S\S\4   S\\   S	\\	   SS4S
 jjr
S\\\      S\\   S\\   SS4S jrSrg)_NurseryL   r   c                 ,   #    [        5       U l        U $ 7fr    )settasks)selfs    r   
__aenter___Nursery.__aenter__M   s     /2u
s   N)namefunc.argsrK   c                    [         R                  S:  a  [        R                  " U" U6 5      nO[        R                  " U" U6 5      nX$l        U R                  R                  U5        g r<   )r   r?   r   ensure_futurecreate_taskrK   rG   r(   )rH   rL   rK   rM   tasks        r   
start_soon_Nursery.start_soonQ   sO     f$((t5D&&tT{3D	

tr   exc_type	exc_value	tracebackc                 N  #    [        U R                  5      (       a  [        R                  " [	        U R                  5      5      I S h  vN u  pEU H  nU R                  R                  U5        M      [        U5      S:X  d   e[        U R                  5      (       a  M  g g  NY7f)Nr   )lenrG   r   waittuplediscard)rH   rT   rU   rV   donependingrQ   s          r   	__aexit___Nursery.__aexit__^   sw      $**oo #*,,uTZZ/@"AAMD

""4(  w<1$$$ $**oo Bs   AB%	B#
AB%!B%)rG   )r   rC   )r6   r7   r8   r9   rI   r   r   r   r   strrR   r   BaseExceptionr^   r:   r   r   r   rC   rC   L   s     #	sCx  } sm	
 
%4./% M*% C=	%
 
%r   rC   c                      [        5       $ r    )rC   r   r   r   open_nurseryrc   r   s
    :r   )r   N)r   zOptional[asyncio.Task[Any]])__doc__r   collectionsr   typingr   r   r   r   r   r   r   _pyfuse3r
   Lockr   r   r`   r   defaultdictrF   r'   r/   r3   	Exceptionr2   rA   rC   rc   r   r   r   <module>rk      s   
   
 ? ?  !||'C  '',"K "D "/{ /t /
	) 	&#% #%Lh r   