o
    sJd                     @   s   d Z ddlZddlZddlZddlmZmZmZmZm	Z	 ddl
Z
ddlmZ ejZdddZddd	Zdefd
dZeeZdeddfddZdeddfddZG dd deZdeej fddZG dd dZdefddZdS )u   
pyfuse3_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Type)FileHandleTreturnc                  C   s    t jd } | | _| | _| t_dS )zSwitch pyfuse3 to asyncio mode.pyfuse3_asyncioN)sysmodulesZlowlevelZfrom_threadpyfuse3trio)Z	fake_trio r   3usr/lib/python3.10/site-packages/pyfuse3_asyncio.pyenable   s   

r   c                   C   s   t jd t_dS )z&Switch pyfuse3 to default (trio) mode.r   N)r
   r   r   r   r   r   r   r   disable!   s   r   c                   C   s   dS )Nasyncior   r   r   r   r   current_trio_token'   s   r   fdc              	      s   t  }t  | z.t   |jd  | fdd |I d H  W t  | t  s9t = d S d S t  | t  sIt = w )Nc                    s
     S N)Zremove_reader)fr   Zloopr   r   <lambda>4   s   
 zwait_readable.<locals>.<lambda>)	r   ZFuture_read_futuresaddZget_event_loopZ
add_readerZ
set_resultZadd_done_callbackremove)r   Zfuturer   r   r   wait_readable.   s   
r   c                 C   s   t |  D ]}|t  qd S r   )r   Zset_exceptionClosedResourceError)r   r   r   r   r   notify_closing<   s   r   c                   @   s   e Zd ZdS )r   N)__name__
__module____qualname__r   r   r   r   r   A   s    r   c                   C   s   t jdk r
tj S t S N)      )r
   version_infor   Taskcurrent_taskr   r   r   r   r'   E   s   

r'   c                	   @   sd   e Zd ZdddZdddedee dee ddfd	d
Z	dee
 dee dee ddfddZdS )_Nurseryr   c                    s   t  | _| S r   )settasks)selfr   r   r   
__aenter__M   s   z_Nursery.__aenter__N)namefuncargsr-   c                G   s>   t jdk rt|| }nt|| }||_| j| d S r"   )r
   r%   r   Zensure_futureZcreate_taskr-   r*   r   )r+   r.   r-   r/   taskr   r   r   
start_soonQ   s
   
z_Nursery.start_soonexc_type	exc_value	tracebackc                    s^   t | jr-tt| jI d H \}}|D ]}| j| qt |dks&J t | jsd S d S )Nr   )lenr*   r   waittuplediscard)r+   r2   r3   r4   donependingr0   r   r   r   	__aexit__^   s   
z_Nursery.__aexit__)r   r(   )r   r    r!   r,   r   r   r   r   strr1   r   BaseExceptionr;   r   r   r   r   r(   L   s*    

r(   c                   C   s   t  S r   )r(   r   r   r   r   open_nurseryr   s   r>   )r   N)__doc__r   collectionsr
   typingr   r   r   r   r   r   _pyfuse3r   Lockr   r   r<   r   defaultdictr)   r   r   r   	Exceptionr   r&   r'   r(   r>   r   r   r   r   <module>   s$    

	
&