using System; using System.Collections.Generic; using System.Linq; using Svrnty.CQRS.Abstractions.Discovery; namespace Svrnty.CQRS.Discovery; public sealed class CommandDiscovery : ICommandDiscovery { private readonly List _commandMetas; private readonly Dictionary _commandsByName; private readonly Dictionary _commandsByType; public CommandDiscovery(IEnumerable commandMetas) { // Materialize the enumerable to a list once _commandMetas = commandMetas.ToList(); // Build lookup dictionaries for O(1) access _commandsByName = new Dictionary(_commandMetas.Count); _commandsByType = new Dictionary(_commandMetas.Count); foreach (var meta in _commandMetas) { _commandsByName[meta.Name] = meta; _commandsByType[meta.CommandType] = meta; } } public IEnumerable GetCommands() => _commandMetas; public ICommandMeta FindCommand(string name) => _commandsByName.TryGetValue(name, out var meta) ? meta : null; public ICommandMeta FindCommand(Type commandType) => _commandsByType.TryGetValue(commandType, out var meta) ? meta : null; public bool CommandExists(string name) => _commandsByName.ContainsKey(name); public bool CommandExists(Type commandType) => _commandsByType.ContainsKey(commandType); }