Iterable sort()

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);
        }