o
     JAfe%                     @   s@   d dgZ dZdZG dd dZG dd deZG dd  d ZdS )	TopologicalSorter
CycleErrorc                   @   s   e Zd ZdZdd ZdS )	_NodeInfonodenpredecessors
successorsc                 C   s   || _ d| _g | _d S N    r   )selfr    r   /usr/lib/python3.10/graphlib.py__init__
   s   
z_NodeInfo.__init__N)__name__
__module____qualname__	__slots__r   r   r   r   r   r      s    r   c                   @   s   e Zd Z	 dS )r   N)r   r   r   r   r   r   r   r      s    c                   @   s`   e Zd Z	 dddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dd Z
dd Zdd ZdS )r   Nc                 C   sL   i | _ d | _d| _d| _|d ur"| D ]\}}| j|g|R   qd S d S r
   )
_node2info_ready_nodes_npassedout
_nfinisheditemsadd)r   Zgraphr   predecessorsr   r   r   r   *   s   zTopologicalSorter.__init__c                 C   s*   | j | }d u rt| | j |< }|S N)r   getr   )r   r   resultr   r   r   _get_nodeinfo4   s   zTopologicalSorter._get_nodeinfoc                 G   sT   	 | j d ur
td| |}| jt|7  _|D ]}| |}|j| qd S )Nz/Nodes cannot be added after a call to prepare())r   
ValueErrorr   r   lenr	   append)r   r   r   nodeinfoZpredZ	pred_infor   r   r   r   9   s   


zTopologicalSorter.addc                 C   sD   	 | j d ur
tddd | j D | _ |  }|r td|d S )Nzcannot prepare() more than oncec                 S   s   g | ]
}|j d kr|jqS )r   )r   r   ).0ir   r   r   
<listcomp>_   s    z-TopologicalSorter.prepare.<locals>.<listcomp>znodes are in a cycle)r   r   r   values_find_cycler   )r   cycler   r   r   prepareT   s   

zTopologicalSorter.preparec                 C   sX   	 | j d u r
tdt| j }| j}|D ]}t|| _q| j   |  jt|7  _|S Nprepare() must be called first)	r   r   tupler   	_NODE_OUTr   clearr   r    )r   r   n2ir   r   r   r   	get_readyj   s   
	

zTopologicalSorter.get_readyc                 C   s*   	 | j d u r
td| j| jk pt| j S r*   )r   r   r   r   boolr   r   r   r   	is_active   s   
	zTopologicalSorter.is_activec                 C   s   |   S r   )r3   r2   r   r   r   __bool__   s   zTopologicalSorter.__bool__c                 G   s   	 | j d u r
td| j}|D ]X}|| }d u r"td|d|j}|tkrA|dkr5td|d|tkrAtd|dt|_|jD ]}|| }| jd8  _|jdkr_| j | qG|  j	d7  _	qd S )Nr+   znode z was not added using add()r   z% was not passed out (still not ready)z was already marked done   )
r   r   r   r   r   r-   
_NODE_DONEr	   r!   r   )r   Znodesr/   r   r"   stat	successorZsuccessor_infor   r   r   done   s0   



zTopologicalSorter.donec              	   C   s   | j }g }g }t }i }|D ]Y}||v rq	 ||v r,||v r+||| d  |g   S n|| |t|| jj t|||< || |rez|d  }W n tyb   ||	 = |	  Y nw |sInqqd S )NTr   )
r   setr   r!   iterr	   __next__r    StopIterationpop)r   r/   stackZitstackseenZnode2stackir   r   r   r   r'      s<   



zTopologicalSorter._find_cyclec                 c   s@    	 |    |  r|  }|E d H  | j|  |  s
d S d S r   )r)   r3   r0   r9   )r   Z
node_groupr   r   r   static_order   s   

zTopologicalSorter.static_orderr   )r   r   r   r   r   r   r)   r0   r3   r4   r9   r'   rA   r   r   r   r   r   '   s    

/%N)__all__r-   r6   r   r   r   r   r   r   r   r   <module>   s    