a
    zee%                     @   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.9/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   sH   i | _ d | _d| _d| _|d urD| D ]\}}| j|g|R   q(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   sR   | j d urtd| |}| jt|7  _|D ]}| |}|j| q2d 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   sB   | 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   sV   | 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 ]}|| }d u rBtd|d|j}|tkr|dkrjtd|dn|tkrtd|dn t|_|jD ]0}|| }| jd8  _|jdkr| j | q|  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   s*    



zTopologicalSorter.donec              	   C   s   | j }g }g }t }i }|D ]}||v r*q||v rV||v r||| d  |g   S n6|| |t|| jj t|||< || |rz|d  }W q*W q ty   ||	 = |	  Y q0 qqq*qd S )Nr   )
r   setr   r!   iterr	   __next__r    StopIterationpop)r   r/   stackZitstackseenZnode2stackir   r   r   r   r'      s0    



zTopologicalSorter._find_cyclec                 c   s2   |    |  r.|  }|E d H  | j|  qd S r   )r)   r3   r0   r9   )r   Z
node_groupr   r   r   static_order   s
    	
zTopologicalSorter.static_order)N)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
   