package net.minecraft.core; import com.google.common.collect.ImmutableMap; import com.mojang.logging.LogUtils; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Map.Entry; import java.util.stream.Collectors; import java.util.stream.Stream; import net.minecraft.resources.ResourceKey; import org.slf4j.Logger; public interface RegistryAccess extends HolderLookup.Provider { Logger LOGGER = LogUtils.getLogger(); RegistryAccess.Frozen EMPTY = new RegistryAccess.ImmutableRegistryAccess(Map.of()).freeze(); @Override Optional> lookup(ResourceKey> p_256275_); default Registry lookupOrThrow(ResourceKey> p_369484_) { return this.lookup(p_369484_).orElseThrow(() -> new IllegalStateException("Missing registry: " + p_369484_)); } Stream> registries(); @Override default Stream>> listRegistryKeys() { return this.registries().map(p_358094_ -> p_358094_.key); } static RegistryAccess.Frozen fromRegistryOfRegistries(final Registry> p_206166_) { return new RegistryAccess.Frozen() { @Override public Optional> lookup(ResourceKey> p_206220_) { Registry> registry = (Registry>)p_206166_; return registry.getOptional((ResourceKey>)p_206220_); } @Override public Stream> registries() { return p_206166_.entrySet().stream().map(RegistryAccess.RegistryEntry::fromMapEntry); } @Override public RegistryAccess.Frozen freeze() { return this; } }; } default RegistryAccess.Frozen freeze() { class FrozenAccess extends RegistryAccess.ImmutableRegistryAccess implements RegistryAccess.Frozen { protected FrozenAccess(final Stream> p_252031_) { super(p_252031_); } } return new FrozenAccess(this.registries().map(RegistryAccess.RegistryEntry::freeze)); } public interface Frozen extends RegistryAccess { } public static class ImmutableRegistryAccess implements RegistryAccess { private final Map>, ? extends Registry> registries; public ImmutableRegistryAccess(List> p_248540_) { this.registries = p_248540_.stream().collect(Collectors.toUnmodifiableMap(Registry::key, p_247993_ -> p_247993_)); } public ImmutableRegistryAccess(Map>, ? extends Registry> p_206225_) { this.registries = Map.copyOf(p_206225_); } public ImmutableRegistryAccess(Stream> p_206227_) { this.registries = p_206227_.collect(ImmutableMap.toImmutableMap(RegistryAccess.RegistryEntry::key, RegistryAccess.RegistryEntry::value)); } @Override public Optional> lookup(ResourceKey> p_206229_) { return Optional.ofNullable(this.registries.get(p_206229_)).map(p_206232_ -> (Registry)p_206232_); } @Override public Stream> registries() { return this.registries.entrySet().stream().map(RegistryAccess.RegistryEntry::fromMapEntry); } } public record RegistryEntry(ResourceKey> key, Registry value) { private static > RegistryAccess.RegistryEntry fromMapEntry( Entry>, R> p_206242_ ) { return fromUntyped((ResourceKey>)p_206242_.getKey(), p_206242_.getValue()); } private static RegistryAccess.RegistryEntry fromUntyped(ResourceKey> p_206244_, Registry p_206245_) { return new RegistryAccess.RegistryEntry<>((ResourceKey>)p_206244_, (Registry)p_206245_); } private RegistryAccess.RegistryEntry freeze() { return new RegistryAccess.RegistryEntry<>(this.key, this.value.freeze()); } } }