package it.cavallium.data.generator.plugin; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import java.util.Comparator; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.stream.Stream; public class ComputedTypeSupplier { private final Int2ObjectMap> computedTypeMap; private final Int2ObjectMap>> computedTypeDependentsCacheMap = new Int2ObjectOpenHashMap<>(); private final ComputedVersion currentVersion; public ComputedTypeSupplier(Int2ObjectMap> computedTypeMap, ComputedVersion currentVersion) { this.computedTypeMap = computedTypeMap; this.currentVersion = currentVersion; } public ComputedType get(VersionedType type) { var computedType = computedTypeMap.get(type.version().getVersion()).get(type.type()); if (computedType == null) { throw new IllegalStateException("Type " + type + " does not exist"); } return computedType; } public ComputedType get(String type) { return get(new VersionedType(type, currentVersion)); } public Stream getDependencies(VersionedType type) { return computedTypeMap.get(type.version().getVersion()).get(type.type()).getDependencies(); } public Stream getDependents(VersionedType type) { synchronized (computedTypeDependentsCacheMap) { return computedTypeDependentsCacheMap .computeIfAbsent(type.version().getVersion(), x -> new HashMap<>()) .computeIfAbsent(type.type(), typeName -> Objects.requireNonNull(computedTypeMap.get(type.version().getVersion()), () -> "Version " + type.version() + " does not exist") .values().stream().filter(computedType -> computedType.getDependencies().anyMatch(y -> Objects.equals(y.getName(), typeName))).toList()) .stream(); } } /** * Get dependents from the current version */ public Stream getDependents(String type) { return getDependents(new VersionedType(type, currentVersion)); } }