B ÃÌ4]Ï ã@sNdZddlmZddlmZdddgZddd„Zdd d„Zd d„Zd d „Z d S)zTopological sorting algorithms.é)Úutil)ÚCircularDependencyErrorÚsortÚsort_as_subsetsÚ find_cyclesFc cs¤t t¡}x|D]\}}|| |¡qW|r4tjnt}||ƒ}x^|rž|ƒ}x$|D]} | || ¡rR| | ¡qRW|sŒtdt||ƒt|ƒƒ‚|  |¡|VqBWdS)NzCircular dependency detected.) rÚ defaultdictÚsetÚaddZ OrderedSetÚ isdisjointrrÚ _gen_edgesÚdifference_update) ÚtuplesÚallitemsÚdeterministic_orderÚedgesÚparentÚchildÚSetÚtodoÚoutputÚnode©rúN/opt/alt/python37/lib64/python3.7/site-packages/sqlalchemy/util/topological.pyrs"    ccs.x(t|||ƒD]}x|D] }|VqWqWdS)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 rrZset_Úsrrrr,s c CsÒt t¡}x|D]\}}|| |¡qWt|ƒ}tƒ}x”|D]Œ}|g}| |¡} xv|rÈ|d} xd|| D]P}||krœ|| |¡d…} |  | ¡| | ¡|| krj| |¡|   |¡PqjW|  ¡}qTWq>W|S)Néÿÿÿÿ) rrrr Ú differenceÚindexr ÚupdateÚappendÚremoveÚpop) r rrrrZ nodes_to_testrrÚstackrÚtopZcycrrrr8s*       cst‡fdd„ˆDƒƒS)Ncs"g|]}ˆ|D] }||f‘qqSrr)Ú.0ÚleftÚright)rrrú asz_gen_edges..)r)rr)rrr `sr N)F)F) Ú__doc__ÚrÚexcrÚ__all__rrrr rrrrÚs     (