U
    xž^Ï
  ã                   @   sN   d Z ddlmZ ddlmZ dddg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|r0t jnt}||ƒ}|r”|ƒ }|D ]}	| ||	 ¡rJ| |	¡ qJ|s‚tdt| |ƒt|ƒƒ‚| 	|¡ |V  q<d S )NzCircular dependency detected.)
r   ÚdefaultdictÚsetÚaddZ
OrderedSetÚ
isdisjointr   r   Ú
_gen_edgesÚdifference_update)
ÚtuplesÚallitemsÚdeterministic_orderÚedgesÚparentÚchildÚSetÚtodoÚoutputÚnode© r   úC/tmp/pip-install-dq5v43_d/SQLAlchemy/sqlalchemy/util/topological.pyr      s$    
ý
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    c                 C   sÄ   t  t¡}| D ]\}}||  |¡ qt|ƒ}tƒ }|D ]†}|g}| |¡}	|r8|d }
||
 D ]R}||kr’|| |¡d … }|	 |¡ | |¡ ||	kr`| |¡ |	 	|¡  qLq`| 
¡ }qLq8|S )Néÿÿÿÿ)r   r   r   r	   Ú
differenceÚindexr   ÚupdateÚappendÚremoveÚpop)r   r   r   r   r   Znodes_to_testr   r   Ústackr   ÚtopZcycr   r   r   r   8   s*    





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>a   s     
  z_gen_edges.<locals>.<listcomp>)r   r'   r   r'   r   r   `   s    r   N)F)F)
Ú__doc__Ú r   Úexcr   Ú__all__r   r   r   r   r   r   r   r   Ú<module>   s   


(