[addresses] Topological sort of address component dependencies so they get checked/removed in order

This commit is contained in:
Al
2016-05-31 16:01:49 -04:00
parent cd7cd292b7
commit 9c090302f7
2 changed files with 41 additions and 1 deletions

View File

@@ -0,0 +1,32 @@
def topsort(graph):
'''
Topological sort for a dependency graph, e.g.
Usage:
>>> graph = {
'a': ['b'],
'b': ['d'],
'c': ['d', 'a'],
'd': [],
}
>>> topsort(graph)
Returns: ['d', 'b', 'a', 'c']
'''
todos = set(graph.keys())
seen = set()
result = []
while todos:
for key in todos:
deps = graph[key]
if len([d for d in deps if d in seen]) == len(deps):
break
else:
raise Exception('Cycle: {}'.format(todos))
todos.remove(key)
result.append(key)
seen.add(key)
return result