o
    i&                     @  s  U d dl mZ d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mZ d dlmZ dd	lmZ dd
lmZ edZedZd$ddZd$ddZd$ddZeedddG dd dZd%ddZe Zded< G dd dejZG d d! d!e
e Z G d"d# d#e
e Z!dS )&    )annotations)EventLoopTokenRunvarTokenRunVar
checkpointcheckpoint_if_cancelledcancel_shielded_checkpointcurrent_tokenN)	dataclass)TracebackType)AnyGenericLiteralTypeVarfinaloverload)WeakKeyDictionary   )get_async_backend)AsyncBackendTDreturnNonec                        t   I dH  dS )z
    Check for cancellation and allow the scheduler to switch to another task.

    Equivalent to (but more efficient than)::

        await checkpoint_if_cancelled()
        await cancel_shielded_checkpoint()

    .. versionadded:: 3.0

    N)r   r    r   r   H/home/kim/smarthome/.venv/lib/python3.10/site-packages/anyio/lowlevel.pyr         r   c                     r   )z
    Enter a checkpoint if the enclosing cancel scope has been cancelled.

    This does not allow the scheduler to switch to a different task.

    .. versionadded:: 3.0

    N)r   r   r   r   r   r   r   )   s   	r   c                     r   )z
    Allow the scheduler to switch to another task but without checking for cancellation.

    Equivalent to (but potentially more efficient than)::

        with CancelScope(shield=True):
            await checkpoint()

    .. versionadded:: 3.0

    N)r   r   r   r   r   r   r   5   r   r   TF)frozenreprc                   @  s"   e Zd ZU dZded< ded< dS )r   za
    An opaque object that holds a reference to an event loop.

    .. versionadded:: 4.11.0
    ztype[AsyncBackend]backend_classobjectnative_tokenN)__name__
__module____qualname____doc____annotations__r   r   r   r   r   D   s   
 r   c                  C  s   t  } |  }t| |S )z
    Return a token object that can be used to call code in the current event loop from
    another thread.

    :raises NoEventLoopError: if no supported asynchronous event loop is running in the
        current thread

    .. versionadded:: 4.11.0

    )r   r	   r   )r    Z	raw_tokenr   r   r   r	   Q   s   
r	   z1WeakKeyDictionary[object, dict[RunVar[Any], Any]]	_run_varsc                   @  s   e Zd Ze ZdS )_NoValueSetN)r#   r$   r%   enumautoNO_VALUE_SETr   r   r   r   r)   d   s    r)   c                   @  s.   e Zd ZdZdddZdd
dZdddZdS )r   _var_value	_redeemedvar	RunVar[T]value%T | Literal[_NoValueSet.NO_VALUE_SET]c                 C  s   || _ || _d| _d S )NFr-   )selfr1   r3   r   r   r   __init__k   s   
zRunvarToken.__init__r   RunvarToken[T]c                 C  s   | S Nr   r5   r   r   r   	__enter__p      zRunvarToken.__enter__exc_typetype[BaseException] | Noneexc_valBaseException | Noneexc_tbTracebackType | Noner   c                 C  s   | j |  d S r8   )r.   reset)r5   r<   r>   r@   r   r   r   __exit__s   s   zRunvarToken.__exit__N)r1   r2   r3   r4   )r   r7   )r<   r=   r>   r?   r@   rA   r   r   )r#   r$   r%   	__slots__r6   r:   rC   r   r   r   r   r   h   s
    

r   c                   @  s   e Zd ZU dZdZejZded< efd"d	d
Ze	d#ddZ
ed$ddZed%ddZefd&ddZd'ddZd(ddZd)dd Zd!S )*r   a  
    Like a :class:`~contextvars.ContextVar`, except scoped to the running event loop.

    Can be used as a context manager, Just like :class:`~contextvars.ContextVar`, that
    will reset the variable to its previous value when the context block is exited.
    _name_defaultz!Literal[_NoValueSet.NO_VALUE_SET]r,   namestrdefaultr4   c                 C  s   || _ || _d S r8   rE   )r5   rH   rJ   r   r   r   r6      s   
zRunVar.__init__r   dict[RunVar[T], T]c                 C  s6   t  j}zt| W S  ty   i  }t|< | Y S w r8   )r	   r"   r(   KeyError)r5   r"   Zrun_varsr   r   r   _current_vars   s   
zRunVar._current_varsr   T | Dc                 C     d S r8   r   r5   rJ   r   r   r   get   r;   z
RunVar.getr   c                 C  rO   r8   r   r9   r   r   r   rQ      r;   %D | Literal[_NoValueSet.NO_VALUE_SET]c                 C  sZ   z| j |  W S  ty#   |tjur| Y S | jtjur!| j Y S Y nw td| j d)NzRun variable "z!" has no value and no default set)rM   rL   r   r,   rG   LookupErrorrF   rP   r   r   r   rQ      s   

r3   r7   c                 C  s&   | j }t| || tj}||| < |S r8   )rM   r   rQ   r   r,   )r5   r3   Zcurrent_varstokenr   r   r   set   s   z
RunVar.setrT   r   c                 C  sb   |j | ur	td|jrtd|jtju r&z| j| = W n ty%   Y nw |j| j| < d|_d S )Nz)This token does not belong to this RunVarz This token has already been usedT)r.   
ValueErrorr0   r/   r)   r,   rM   rL   )r5   rT   r   r   r   rB      s   

zRunVar.resetc                 C  s   d| j dS )Nz<RunVar name=>)rF   r9   r   r   r   __repr__   s   zRunVar.__repr__N)rH   rI   rJ   r4   )r   rK   )rJ   r   r   rN   )r   r   )rJ   rR   r   rN   )r3   r   r   r7   )rT   r7   r   r   )r   rI   )r#   r$   r%   r&   rD   r)   r,   r'   r6   propertyrM   r   rQ   rU   rB   rX   r   r   r   r   r   |   s"   
 

r   )r   r   )r   r   )"
__future__r   __all__r*   dataclassesr
   typesr   typingr   r   r   r   r   r   weakrefr   Z_core._eventloopr   abcr   r   r   r   r   r   r   r	   r(   r'   Enumr)   r   r   r   r   r   r   <module>   s,    
 




