o
    y¬´\Î
  ã                   @   sL   d Z ddlmZ ddlmZ g d¢Zddd„Zddd	„Zd
d„ Zdd„ Z	dS )zTopological sorting algorithms.é   )Úutil)ÚCircularDependencyError)ÚsortÚsort_as_subsetsÚfind_cyclesFc           
      c   s    � t  t¡}| D ]\}}||  |¡ q|rt jnt}||ƒ}|rN|ƒ }|D ]}	| ||	 ¡r4| |	¡ q&|sBtdt| |ƒt|ƒƒ‚| 	|¡ |V  |s!d S d S )NzCircular dependency detected.)
r   ÚdefaultdictÚsetÚaddÚ
OrderedSetÚ
isdisjointr   r   Ú
_gen_edgesÚdifference_update)
ÚtuplesÚallitemsÚdeterministic_orderÚedgesÚparentÚchildÚSetÚtodoÚoutputÚnode© r   úM/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/util/topological.pyr      s*   €

€ý
òr   c                 c   s(   � t | ||ƒD ]
}|D ]}|V  qqdS )zÁsort the given list of items by dependency.

    'tuples' is a list of tuples representing a partial ordering.
    'deterministic_order' keeps items within a dependency tier in list order.
    N)r   )r   r   r   Úset_Úsr   r   r   r   +   s   €ÿÿr   c                 C   sÆ   t  t¡}| D ]\}}||  |¡ qt|ƒ}tƒ }|D ]D}|g}| |¡}	|r`|d }
||
 D ])}||v rI|| |¡d … }|	 |¡ | |¡ ||	v rY| |¡ |	 	|¡  nq0| 
¡ }|s(q|S )Néÿÿÿÿ)r   r   r   r	   Ú
differenceÚindexr   ÚupdateÚappendÚremoveÚpop)r   r   r   r   r   Únodes_to_testr   r   Ústackr   ÚtopÚcycr   r   r   r   7   s0   





ýó€r   c                    s   t ‡ fdd„ˆ D ƒƒS )Nc                    s"   g | ]}ˆ | D ]}||f‘qqS r   r   )Ú.0ÚleftÚright©r   r   r   Ú
<listcomp>`   s   " z_gen_edges.<locals>.<listcomp>)r   r*   r   r*   r   r   _   s   r   N)F)
Ú__doc__Ú r   Úexcr   Ú__all__r   r   r   r   r   r   r   r   Ú<module>   s   

(