using System.Collections.Generic; using System; namespace DCFApixels.DragonECS { public interface IEcsProcessorsMessenger { public EcsSession Source { get; } } public interface IEcsProcessorsMessenger : IEcsProcessorsMessenger where TMessage : IEcsMessage { } public class EcsProcessorsMessenger : IEcsProcessorsMessenger, IDisposable where TMessage : IEcsMessage { private readonly EcsSession _source; private readonly IReceive[] _targets; public EcsSession Source => _source; public IReadOnlyList> Targets => _targets; internal EcsProcessorsMessenger(EcsSession source) { _source = source; List> list = new List>(); foreach (var item in _source.AllProcessors) { if (item is IReceive targetItem) { list.Add(targetItem); } } _targets = list.ToArray(); } public void Send(in TMessage message) { foreach (var item in _targets) { item.Do(_source, in message); } } public void Destroy() => _source.OnMessengerDetroyed(this); void IDisposable.Dispose() => Destroy(); } }