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> multimap, Map>, RecipeHolder> map) { this.byType = multimap; this.byKey = map; } public static RecipeMap create(Iterable> iterable) { Builder, RecipeHolder> builder = ImmutableMultimap.builder(); com.google.common.collect.ImmutableMap.Builder>, RecipeHolder> builder2 = ImmutableMap.builder(); for (RecipeHolder recipeHolder : iterable) { builder.put(recipeHolder.value().getType(), recipeHolder); builder2.put(recipeHolder.id(), recipeHolder); } return new RecipeMap(builder.build(), builder2.build()); } public > Collection> byType(RecipeType recipeType) { return (Collection>)this.byType.get(recipeType); } public Collection> values() { return this.byKey.values(); } @Nullable public RecipeHolder byKey(ResourceKey> resourceKey) { return (RecipeHolder)this.byKey.get(resourceKey); } public > Stream> getRecipesFor(RecipeType recipeType, I recipeInput, Level level) { return recipeInput.isEmpty() ? Stream.empty() : this.byType(recipeType).stream().filter(recipeHolder -> recipeHolder.value().matches(recipeInput, level)); } }