001/* 002 * SPDX-License-Identifier: Apache-2.0 003 * 004 * Copyright 2025-2026 The Enola <https://enola.dev> Authors 005 * 006 * Licensed under the Apache License, Version 2.0 (the "License"); 007 * you may not use this file except in compliance with the License. 008 * You may obtain a copy of the License at 009 * 010 * https://www.apache.org/licenses/LICENSE-2.0 011 * 012 * Unless required by applicable law or agreed to in writing, software 013 * distributed under the License is distributed on an "AS IS" BASIS, 014 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018package dev.enola.common.io.object; 019 020import com.google.errorprone.annotations.CanIgnoreReturnValue; 021 022import dev.enola.common.name.NamedObjectProviders; 023import dev.enola.common.name.NamedObjectStore; 024 025import java.util.Optional; 026 027/** 028 * ObjectStore is an in-memory store (and {@link ProviderFromID}) for {@link Identifiable} objects. 029 * 030 * <p>It supports distinct objects with the same ID but different classes, effectively "scoping" 031 * them by their class. 032 */ 033public class ObjectStore implements ProviderFromID { 034 035 // TODO ObjectStore newImmutable(Map<String, Identifiable> map) 036 037 public static ObjectStore newConcurrent() { 038 return new ObjectStore(NamedObjectProviders.newConcurrent()); 039 } 040 041 public static ObjectStore newSingleThreaded() { 042 return new ObjectStore(NamedObjectProviders.newSingleThreaded()); 043 } 044 045 private final NamedObjectStore namedObjectStore; 046 047 public ObjectStore(NamedObjectStore namedObjectStore) { 048 this.namedObjectStore = namedObjectStore; 049 } 050 051 @CanIgnoreReturnValue 052 public ObjectStore store(Identifiable o) throws IllegalStateException { 053 namedObjectStore.store(o.id(), o); 054 return this; 055 } 056 057 @Override 058 public <T extends Identifiable> Optional<T> opt(String id, Class<T> clazz) { 059 return namedObjectStore.opt(id, clazz); 060 } 061}