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.ResourceLocation; @Environment(EnvType.CLIENT) public interface ResourceLocationSearchTree { static ResourceLocationSearchTree empty() { return new ResourceLocationSearchTree() { @Override public List searchNamespace(String query) { return List.of(); } @Override public List searchPath(String query) { return List.of(); } }; } static ResourceLocationSearchTree create(List contents, Function> idGetter) { if (contents.isEmpty()) { return empty(); } else { final SuffixArray suffixArray = new SuffixArray<>(); final SuffixArray suffixArray2 = new SuffixArray<>(); for (T object : contents) { ((Stream)idGetter.apply(object)).forEach(resourceLocation -> { suffixArray.add(object, resourceLocation.getNamespace().toLowerCase(Locale.ROOT)); suffixArray2.add(object, resourceLocation.getPath().toLowerCase(Locale.ROOT)); }); } suffixArray.generate(); suffixArray2.generate(); return new ResourceLocationSearchTree() { @Override public List searchNamespace(String query) { return suffixArray.search(query); } @Override public List searchPath(String query) { return suffixArray2.search(query); } }; } } List searchNamespace(String query); List searchPath(String query); }