diff --git a/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/impl/EntrypointComparator.java b/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/impl/EntrypointComparator.java index aafe3f8..3abe2e0 100644 --- a/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/impl/EntrypointComparator.java +++ b/libjf-resource-pack-entry-widgets-v0/src/client/java/io/gitlab/jfronny/libjf/entrywidgets/impl/EntrypointComparator.java @@ -4,12 +4,31 @@ import io.gitlab.jfronny.libjf.entrywidgets.api.v0.ResourcePackEntryWidget; import net.fabricmc.loader.api.entrypoint.EntrypointContainer; import java.util.Comparator; +import java.util.function.Function; +/** + * Shuffles the entrypoints in the resource pack entry widget. + * Although the order is (intentionally) not guaranteed, it is consistent. + */ public class EntrypointComparator implements Comparator> { @Override public int compare(EntrypointContainer o1, EntrypointContainer o2) { - return Comparator., String>comparing(entrypoint -> entrypoint.getProvider().getMetadata().getId()) - .thenComparing(s -> s.getEntrypoint().getClass().getName()) - .compare(o1, o2); + return compareByValues(o1, o2, + s -> s.getProvider().getMetadata().getId().hashCode(), + s -> s.getProvider().getMetadata().getId(), + s -> s.getEntrypoint().getClass().getName() + ); + } + + @SuppressWarnings({"rawtypes", "unchecked"}) + @SafeVarargs + private static int compareByValues(T left, T right, Function... extractors) { + for (Function extractor : extractors) { + int result = extractor.apply(left).compareTo(extractor.apply(right)); + if (result != 0) { + return result; + } + } + return 0; } }