
     f
                        d dl mZ d dlmZ d dlmZ d dlmZ d dlZddl	m
Z
mZmZ erd dlmZ ej         ej        d	d	d	
           G d d                                  ZdS )    )annotations)defaultdict)asynccontextmanager)TYPE_CHECKINGN   )Event_core_util)AsyncIteratorF)eqhashslotsc                      e Zd ZU dZ ej        d d          Zded<    ej        ed          Z	ded<    ej        dd	          Z
d
ed<   edd            ZdS )	Sequencera  A convenience class for forcing code in different tasks to run in an
    explicit linear order.

    Instances of this class implement a ``__call__`` method which returns an
    async context manager. The idea is that you pass a sequence number to
    ``__call__`` to say where this block of code should go in the linear
    sequence. Block 0 starts immediately, and then block N doesn't start until
    block N-1 has finished.

    Example:
      An extremely elaborate way to print the numbers 0-5, in order::

         async def worker1(seq):
             async with seq(0):
                 print(0)
             async with seq(4):
                 print(4)

         async def worker2(seq):
             async with seq(2):
                 print(2)
             async with seq(5):
                 print(5)

         async def worker3(seq):
             async with seq(1):
                 print(1)
             async with seq(3):
                 print(3)

         async def main():
            seq = trio.testing.Sequencer()
            async with trio.open_nursery() as nursery:
                nursery.start_soon(worker1, seq)
                nursery.start_soon(worker2, seq)
                nursery.start_soon(worker3, seq)

    c                 *    t          t                    S )N)r   r        Z/var/www/api.educacionweb.es/myenv/lib/python3.11/site-packages/trio/testing/_sequencer.py<lambda>zSequencer.<lambda>:   s    E** r   F)factoryinitzdefaultdict[int, Event]_sequence_pointszset[int]_claimed)defaultr   bool_brokenpositionintreturnAsyncIterator[None]c               x  K   || j         v rt          d|           | j        rt          d          | j                             |           |dk    r	 | j        |                                          d {V  | j        rt          d          nZ# t          j        $ rH d| _        | j                                        D ]}|	                                 t          d          d w xY w	 d W V  | j        |dz            	                                 d S # | j        |dz            	                                 w xY w)Nz"Attempted to reuse sequence point zsequence broken!r   Tz+Sequencer wait cancelled -- sequence broken   )
r   RuntimeErrorr   addr   waitr	   	Cancelledvaluesset)selfr   events      r   __call__zSequencer.__call__?   sv     t}$$NHNNOOO< 	31222(###q==;+H5::<<<<<<<<< < ;&'9:::; ?   #!299;;    EIIKKKK"A 		6EEEE!(Q,/3355555D!(Q,/335555s   %B AC(,D $D9N)r   r   r   r    )__name__
__module____qualname____doc__attrsfieldr   __annotations__r(   r   r   r   r+   r   r   r   r   r      s         % %N 1<**1 1 1     %Su===H====EKE:::G::::6 6 6 6 6 6r   r   )
__future__r   collectionsr   
contextlibr   typingr   r0    r   r	   r
   collections.abcr   finaldefiner   r   r   r   <module>r;      s    " " " " " " # # # # # # * * * * * *              " " " " " " " " " " .------ U%000E6 E6 E6 E6 E6 E6 E6 10 E6 E6 E6r   