package net.minecraft.client.searchtree; import java.util.List; import java.util.Locale; import java.util.function.Function; import java.util.stream.Stream; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.resources.Identifier; @Environment(EnvType.CLIENT) public interface IdentifierSearchTree { static IdentifierSearchTree empty() { return new IdentifierSearchTree() { @Override public List searchNamespace(final String namespace) { return List.of(); } @Override public List searchPath(final String path) { return List.of(); } }; } static IdentifierSearchTree create(final List elements, final Function> idGetter) { if (elements.isEmpty()) { return empty(); } else { final SuffixArray namespaceTree = new SuffixArray<>(); final SuffixArray pathTree = new SuffixArray<>(); for (T element : elements) { ((Stream)idGetter.apply(element)).forEach(elementId -> { namespaceTree.add(element, elementId.getNamespace().toLowerCase(Locale.ROOT)); pathTree.add(element, elementId.getPath().toLowerCase(Locale.ROOT)); }); } namespaceTree.generate(); pathTree.generate(); return new IdentifierSearchTree() { @Override public List searchNamespace(final String namespace) { return namespaceTree.search(namespace); } @Override public List searchPath(final String path) { return pathTree.search(path); } }; } } List searchNamespace(String namespace); List searchPath(String path); }