in lib/src/topological_sort.dart [31:56]
List<T> topologicalSort<T>(Iterable<T> nodes, Iterable<T> Function(T) edges,
{bool Function(T, T)? equals, int Function(T)? hashCode}) {
// https://en.wikipedia.org/wiki/Topological_sorting#Depth-first_search
var result = QueueList<T>();
var permanentMark = HashSet<T>(equals: equals, hashCode: hashCode);
var temporaryMark = LinkedHashSet<T>(equals: equals, hashCode: hashCode);
void visit(T node) {
if (permanentMark.contains(node)) return;
if (temporaryMark.contains(node)) {
throw CycleException(temporaryMark);
}
temporaryMark.add(node);
for (var child in edges(node)) {
visit(child);
}
temporaryMark.remove(node);
permanentMark.add(node);
result.addFirst(node);
}
for (var node in nodes) {
visit(node);
}
return result;
}