#nullable enable using System; using ShrinkEventBus; using Unity.Collections; namespace ShrinkEventBus.Entities { /// Burst-safe producer queue; playback enters the regular Bus instance. public sealed class ShrinkEcsEventQueue : IDisposable where TEvent : unmanaged, IShrinkEvent { private NativeQueue _queue; public ShrinkEcsEventQueue(Allocator allocator = Allocator.Persistent) { _queue = new NativeQueue(allocator); Writer = new ShrinkEcsEventWriter(_queue.AsParallelWriter()); } public ShrinkEcsEventWriter Writer { get; } public int Playback(IShrinkEventBus bus) { if (bus == null) throw new ArgumentNullException(nameof(bus)); var count = 0; while (_queue.TryDequeue(out var eventData)) { bus.Post(in eventData); count++; } return count; } public void Dispose() { if (_queue.IsCreated) _queue.Dispose(); } } public readonly struct ShrinkEcsEventWriter where TEvent : unmanaged, IShrinkEvent { private readonly NativeQueue.ParallelWriter _writer; internal ShrinkEcsEventWriter(NativeQueue.ParallelWriter writer) { _writer = writer; } public void Post(in TEvent eventData) => _writer.Enqueue(eventData); } }