const std = @import("std"); const mpsc = @import("../mpsc.zig"); pub fn Queue(comptime T: type) type { return struct { const Self = @This(); ring_buffer: mpsc.RingBuffer(T), pub fn init(buffer: []mpsc.Slot(T)) Self { return .{ .ring_buffer = mpsc.RingBuffer(T).init(buffer), }; } pub fn blockingEnqueue(self: *Self, value: T) void { while (true) { self.ring_buffer.enqueue(value) catch |err| switch (err) { error.Overflow => { std.atomic.spinLoopHint(); continue; }, }; return; } } pub fn dequeue(self: *Self) ?T { return self.ring_buffer.dequeue() catch |err| switch (err) { error.Underflow => return null, }; } }; }