minecraft-src/net/minecraft/client/searchtree/ResourceLocationSearchTree.java
2025-07-04 01:41:11 +03:00

60 lines
1.6 KiB
Java

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<T> {
static <T> ResourceLocationSearchTree<T> empty() {
return new ResourceLocationSearchTree<T>() {
@Override
public List<T> searchNamespace(String query) {
return List.of();
}
@Override
public List<T> searchPath(String query) {
return List.of();
}
};
}
static <T> ResourceLocationSearchTree<T> create(List<T> contents, Function<T, Stream<ResourceLocation>> idGetter) {
if (contents.isEmpty()) {
return empty();
} else {
final SuffixArray<T> suffixArray = new SuffixArray<>();
final SuffixArray<T> 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<T>() {
@Override
public List<T> searchNamespace(String query) {
return suffixArray.search(query);
}
@Override
public List<T> searchPath(String query) {
return suffixArray2.search(query);
}
};
}
}
List<T> searchNamespace(String query);
List<T> searchPath(String query);
}