package net.minecraft.util; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.function.BiConsumer; import java.util.function.Consumer; public class DependencySorter> { private final Map contents = new HashMap(); public DependencySorter addEntry(K key, V value) { this.contents.put(key, value); return this; } private void visitDependenciesAndElement(Multimap dependencies, Set visited, K element, BiConsumer action) { if (visited.add(element)) { dependencies.get(element).forEach(object -> this.visitDependenciesAndElement(dependencies, visited, (K)object, action)); V entry = (V)this.contents.get(element); if (entry != null) { action.accept(element, entry); } } } private static boolean isCyclic(Multimap dependencies, K source, K target) { Collection collection = dependencies.get(target); return collection.contains(source) ? true : collection.stream().anyMatch(object2 -> isCyclic(dependencies, source, (K)object2)); } private static void addDependencyIfNotCyclic(Multimap dependencies, K source, K target) { if (!isCyclic(dependencies, source, target)) { dependencies.put(source, target); } } public void orderByDependencies(BiConsumer action) { Multimap multimap = HashMultimap.create(); this.contents.forEach((object, entry) -> entry.visitRequiredDependencies(object2 -> addDependencyIfNotCyclic(multimap, (K)object, (K)object2))); this.contents.forEach((object, entry) -> entry.visitOptionalDependencies(object2 -> addDependencyIfNotCyclic(multimap, (K)object, (K)object2))); Set set = new HashSet(); this.contents.keySet().forEach(object -> this.visitDependenciesAndElement(multimap, set, (K)object, action)); } public interface Entry { void visitRequiredDependencies(Consumer visitor); void visitOptionalDependencies(Consumer visitor); } }