DeterministicAudioNodeExecutorRegistry.java

package org.hammer.audio.dsp.workflow;

import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap;

/** Immutable registry mapping stable workflow node types to deterministic audio executors. */
final class DeterministicAudioNodeExecutorRegistry {

  private final Map<String, DeterministicAudioNodeExecutor> executorsByType;

  DeterministicAudioNodeExecutorRegistry(List<DeterministicAudioNodeExecutor> executors) {
    Objects.requireNonNull(executors, "executors");
    Map<String, DeterministicAudioNodeExecutor> registered = new ConcurrentHashMap<>();
    for (DeterministicAudioNodeExecutor executor : executors) {
      DeterministicAudioNodeExecutor required = Objects.requireNonNull(executor, "executor");
      String nodeType = required.nodeType();
      if (nodeType == null || nodeType.isBlank()) {
        throw new IllegalArgumentException("executor nodeType must not be blank");
      }
      if (registered.putIfAbsent(nodeType, required) != null) {
        throw new IllegalArgumentException("Duplicate deterministic executor for " + nodeType);
      }
    }
    executorsByType = Map.copyOf(registered);
  }

  static DeterministicAudioNodeExecutorRegistry standard() {
    return new DeterministicAudioNodeExecutorRegistry(
        List.of(new SyntheticSignalNodeExecutor(), new GainNodeExecutor()));
  }

  Optional<DeterministicAudioNodeExecutor> find(String nodeType) {
    return Optional.ofNullable(executorsByType.get(nodeType));
  }
}