35 lines
652 B
TypeScript
35 lines
652 B
TypeScript
export type RingBuffer<T> = {
|
|
size: number;
|
|
mask: number;
|
|
cursor: number;
|
|
buffer: Array<T>;
|
|
};
|
|
|
|
export function createRingBuffer<T extends object>(
|
|
size: number,
|
|
create: () => T,
|
|
): RingBuffer<T> {
|
|
if ((size & (size - 1)) !== 0) {
|
|
throw new Error("size must be a power of two");
|
|
}
|
|
|
|
const buffer = new Array<T>(size);
|
|
for (let i = 0; i < size; i++) {
|
|
buffer[i] = create();
|
|
}
|
|
|
|
return {
|
|
size,
|
|
mask: size - 1,
|
|
cursor: 0,
|
|
buffer,
|
|
};
|
|
}
|
|
|
|
export function claim<T>(ring: RingBuffer<T>, reset: (instance: T) => T): T {
|
|
const instance = ring.buffer[ring.cursor];
|
|
ring.cursor = (ring.cursor + 1) & ring.mask;
|
|
|
|
return reset(instance);
|
|
}
|