B
    þ¦†\Ï
  ã               @   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¡}x| D ]\}}||  |¡ qW |r4t jnt}||ƒ}x^|rž|ƒ }x$|D ]}	| ||	 ¡rR| |	¡ qRW |sŒtdt| |ƒt|ƒƒ‚| 	|¡ |V  qBW 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   ú:lib/python3.7/site-packages/sqlalchemy/util/topological.pyr      s"    



c             c   s.   x(t | ||ƒD ]}x|D ]
}|V  qW qW 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   Zset_Úsr   r   r   r   ,   s    
c             C   sÒ   t  t¡}x| D ]\}}||  |¡ qW t|ƒ}tƒ }x”|D ]Œ}|g}| |¡}	xv|rÈ|d }
xd||
 D ]P}||krœ|| |¡d … }|	 |¡ | |¡ ||	krj| |¡ |	 	|¡ P qjW | 
¡ }qTW q>W |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   


(