package net.minecraft.world.item.crafting; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMultimap; import com.google.common.collect.Multimap; import com.google.common.collect.ImmutableMultimap.Builder; import java.util.Collection; import java.util.Map; import java.util.stream.Stream; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; public class RecipeMap { public static final RecipeMap EMPTY = new RecipeMap(ImmutableMultimap.of(), Map.of()); private final Multimap, RecipeHolder> byType; private final Map>, RecipeHolder> byKey; private RecipeMap(Multimap, RecipeHolder> byType, Map>, RecipeHolder> byKey) { this.byType = byType; this.byKey = byKey; } public static RecipeMap create(Iterable> recipes) { Builder, RecipeHolder> builder = ImmutableMultimap.builder(); com.google.common.collect.ImmutableMap.Builder>, RecipeHolder> builder2 = ImmutableMap.builder(); for (RecipeHolder recipeHolder : recipes) { builder.put(recipeHolder.value().getType(), recipeHolder); builder2.put(recipeHolder.id(), recipeHolder); } return new RecipeMap(builder.build(), builder2.build()); } public > Collection> byType(RecipeType type) { return (Collection>)this.byType.get(type); } public Collection> values() { return this.byKey.values(); } @Nullable public RecipeHolder byKey(ResourceKey> key) { return (RecipeHolder)this.byKey.get(key); } public > Stream> getRecipesFor(RecipeType type, I input, Level level) { return input.isEmpty() ? Stream.empty() : this.byType(type).stream().filter(recipeHolder -> recipeHolder.value().matches(input, level)); } }