*/ private array $lookupCache = []; /** @phpstan-var ObjectSet<\Closure(FurnaceRecipe) : void> */ private ObjectSet $recipeRegisteredCallbacks; public function __construct(){ $this->recipeRegisteredCallbacks = new ObjectSet(); } /** * @phpstan-return ObjectSet<\Closure(FurnaceRecipe) : void> */ public function getRecipeRegisteredCallbacks() : ObjectSet{ return $this->recipeRegisteredCallbacks; } /** * @return FurnaceRecipe[] */ public function getAll() : array{ return $this->furnaceRecipes; } public function register(FurnaceRecipe $recipe) : void{ $this->furnaceRecipes[] = $recipe; foreach($this->recipeRegisteredCallbacks as $callback){ $callback($recipe); } } public function match(Item $input) : ?FurnaceRecipe{ $index = morton2d_encode($input->getTypeId(), $input->computeTypeData()); $simpleRecipe = $this->lookupCache[$index] ?? null; if($simpleRecipe !== null){ return $simpleRecipe; } foreach($this->furnaceRecipes as $recipe){ if($recipe->getInput()->accepts($input)){ //remember that this item is accepted by this recipe, so we don't need to bruteforce it again $this->lookupCache[$index] = $recipe; return $recipe; } } return null; } }