39 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
	
		
			1.2 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;
 | |
| 
 | |
| @FunctionalInterface
 | |
| @Environment(EnvType.CLIENT)
 | |
| public interface SearchTree<T> {
 | |
| 	static <T> SearchTree<T> empty() {
 | |
| 		return string -> List.of();
 | |
| 	}
 | |
| 
 | |
| 	static <T> SearchTree<T> plainText(List<T> list, Function<T, Stream<String>> function) {
 | |
| 		if (list.isEmpty()) {
 | |
| 			return empty();
 | |
| 		} else {
 | |
| 			SuffixArray<T> suffixArray = new SuffixArray<>();
 | |
| 
 | |
| 			for (T object : list) {
 | |
| 				((Stream)function.apply(object)).forEach(string -> suffixArray.add(object, string.toLowerCase(Locale.ROOT)));
 | |
| 			}
 | |
| 
 | |
| 			suffixArray.generate();
 | |
| 			return suffixArray::search;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Searches this search tree for the given text.
 | |
| 	 * <p>
 | |
| 	 * If the query does not contain a {@code :}, then only {@link #byName} is searched. If it does contain a colon, both {@link #byName} and {@link #byId} are searched and the results are merged using a {@link MergingIterator}.
 | |
| 	 * @return A list of all matching items in this search tree.
 | |
| 	 */
 | |
| 	List<T> search(String query);
 | |
| }
 |