a
    (ñ»jÂ  ã                	   @  sÌ   d dl mZ d dlmZmZmZ d dlZd dlZd dlm	Z	 ddl
mZmZmZmZ erdd dlmZ eded	�Zed
ed	�Zdddœdd„Zdddœdd„Ze	ejddd�G dd„ deeeef ƒƒƒZdS )é    )Úannotations)ÚTYPE_CHECKINGÚGenericÚTypeVarN)Úfinalé   )ÚAsyncResourceÚHalfCloseableStreamÚReceiveStreamÚ
SendStream)Ú	TypeGuardÚSendStreamT)ÚboundÚReceiveStreamTr   ÚNone)ÚresourceÚreturnc                 Ã  sF   t  ¡ �*}|jdd� |  ¡ I dH  W d  ƒ n1 s80    Y  dS )aë  Close an async resource or async generator immediately, without
    blocking to do any graceful cleanup.

    :class:`~trio.abc.AsyncResource` objects guarantee that if their
    :meth:`~trio.abc.AsyncResource.aclose` method is cancelled, then they will
    still close the resource (albeit in a potentially ungraceful
    fashion). :func:`aclose_forcefully` is a convenience function that
    exploits this behavior to let you force a resource to be closed without
    blocking: it works by calling ``await resource.aclose()`` and then
    cancelling it immediately.

    Most users won't need this, but it may be useful on cleanup paths where
    you can't afford to block, or if you want to close a resource and don't
    care about handling it gracefully. For example, if
    :class:`~trio.SSLStream` encounters an error and cannot perform its
    own graceful close, then there's no point in waiting to gracefully shut
    down the underlying transport either, so it calls ``await
    aclose_forcefully(self.transport_stream)``.

    Note that this function is async, and that it acts as a checkpoint, but
    unlike most async functions it cannot block indefinitely (at least,
    assuming the underlying resource object is correctly implemented).

    z"cancelled during aclose_forcefully)ÚreasonN)ÚtrioZCancelScopeÚcancelÚaclose)r   Úcs© r   ú=E:\soccer\ml_env\Lib\site-packages\trio/_highlevel_generic.pyÚaclose_forcefully   s    
r   r   zTypeGuard[HalfCloseableStream])Ústreamr   c                 C  s
   t | dƒS )z,Check if the stream has a send_eof() method.Úsend_eof)Úhasattr)r   r   r   r   Ú_is_halfclosable2   s    r   F)ÚeqÚslotsc                   @  sn   e Zd ZU dZded< ded< dddœd	d
„Zddœdd„Zddœdd„Zddddœdd„Zddœdd„Z	dS )ÚStapledStreama–  This class `staples <https://en.wikipedia.org/wiki/Staple_(fastener)>`__
    together two unidirectional streams to make single bidirectional stream.

    Args:
      send_stream (~trio.abc.SendStream): The stream to use for sending.
      receive_stream (~trio.abc.ReceiveStream): The stream to use for
          receiving.

    Example:

       A silly way to make a stream that echoes back whatever you write to
       it::

          left, right = trio.testing.memory_stream_pair()
          echo_stream = StapledStream(SocketStream(left), SocketStream(right))
          await echo_stream.send_all(b"x")
          assert await echo_stream.receive_some() == b"x"

    :class:`StapledStream` objects implement the methods in the
    :class:`~trio.abc.HalfCloseableStream` interface. They also have two
    additional public attributes:

    .. attribute:: send_stream

       The underlying :class:`~trio.abc.SendStream`. :meth:`send_all` and
       :meth:`wait_send_all_might_not_block` are delegated to this object.

    .. attribute:: receive_stream

       The underlying :class:`~trio.abc.ReceiveStream`. :meth:`receive_some`
       is delegated to this object.

    r   Úsend_streamr   Úreceive_streamzbytes | bytearray | memoryviewr   )Údatar   c                 Ã  s   | j  |¡I dH S )z$Calls ``self.send_stream.send_all``.N)r"   Úsend_all)Úselfr$   r   r   r   r%   b   s    zStapledStream.send_all)r   c                 Ã  s   | j  ¡ I dH S )z9Calls ``self.send_stream.wait_send_all_might_not_block``.N)r"   Úwait_send_all_might_not_block©r&   r   r   r   r'   f   s    z+StapledStream.wait_send_all_might_not_blockc                 Ã  s.   | j }t|ƒr| ¡ I dH S | ¡ I dH S dS )a  Shuts down the send side of the stream.

        If :meth:`self.send_stream.send_eof() <trio.abc.HalfCloseableStream.send_eof>` exists,
        then this calls it. Otherwise, this calls
        :meth:`self.send_stream.aclose() <trio.abc.AsyncResource.aclose>`.
        N)r"   r   r   r   )r&   r   r   r   r   r   j   s    zStapledStream.send_eofNz
int | NoneÚbytes)Ú	max_bytesr   c                 Ã  s   | j  |¡I dH S )z+Calls ``self.receive_stream.receive_some``.N)r#   Úreceive_some)r&   r*   r   r   r   r+   x   s    zStapledStream.receive_somec                 Ã  s<   z$| j  ¡ I dH  W | j ¡ I dH  n| j ¡ I dH  0 dS )z,Calls ``aclose`` on both underlying streams.N)r"   r   r#   r(   r   r   r   r   |   s    zStapledStream.aclose)N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__r%   r'   r   r+   r   r   r   r   r   r!   7   s   
"r!   )Ú
__future__r   Útypingr   r   r   Úattrsr   Z
trio._utilr   Úabcr   r	   r
   r   Ztyping_extensionsr   r   r   r   r   Zdefiner!   r   r   r   r   Ú<module>   s"   

þ