in processor/src/main/java/org/apache/commons/weaver/utils/Providers.java [52:72]
Iterable<P> sort(final Iterable<P> providers) {
Validate.noNullElements(providers);
final Map<Class<? extends P>, Set<Class<? extends P>>> dependencyMap = toDependencyMap(providers);
final Collection<Class<? extends P>> order = new LinkedHashSet<>();
final Map<Class<? extends P>, State> stateMap = new HashMap<>();
final Deque<Class<? extends P>> visiting = new ArrayDeque<>();
for (final Class<? extends P> type : dependencyMap.keySet()) {
final State state = stateMap.get(type);
if (state == null) {
tsort(type, dependencyMap, stateMap, visiting, order);
} else {
Validate.validState(state != State.VISITING, "Unexpected node in visiting state: %s", type);
}
}
return imposeOrder(providers, order);
}