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(pooled: Pooled): T { const slot = pooled.buffer[pooled.cursor]; pooled.cursor = (pooled.cursor + 1) & pooled.mask; return slot; }