export type Pooled = { size: number; mask: number; cursor: number; buffer: Array; }; export function createRingBuffer( size: number, create: () => T, ): Pooled { if ((size & (size - 1)) !== 0) { throw new Error("size must be a power of two"); } const buffer = new Array(size); for (let i = 0; i < size; i++) { buffer[i] = create(); } return { size, mask: size - 1, cursor: 0, buffer, }; } export function claim(ring: Pooled): T { const slot = ring.buffer[ring.cursor]; ring.cursor = (ring.cursor + 1) & ring.mask; return slot; }