/** * Generates unique IDs for Kitty image rendering. */ const MIN_ID = 1048576; const MAX_ID = 16777216; class KittyIdGenerator { private currentId = MIN_ID; private freedIds = new Set(); generateId(): number { // Reuse freed ID if available if (this.freedIds.size > 0) { const result = this.freedIds.values().next(); if (result.done) { throw new Error( "Kitty ID reuse error: Set iterator unexpectedly empty", ); } const reusedId = result.value; this.freedIds.delete(reusedId); return reusedId; } // Generate new sequential ID if (this.currentId >= MAX_ID) { throw new Error("Kitty ID overflow: Maximum ID value reached"); } return this.currentId++; } freeId(id: number): boolean { // Validate ID is in our managed range and was previously allocated if (id >= MIN_ID && id < this.currentId) { return this.freedIds.add(id).size > this.freedIds.size - 1; } return false; } // Utility methods getActiveIdCount(): number { return this.currentId - MIN_ID - this.freedIds.size; } getAvailableIdCount(): number { return MAX_ID - this.currentId + this.freedIds.size; } } // Export singleton instance const generator = new KittyIdGenerator(); export const generateId = () => generator.generateId(); export const freeId = (id: number) => generator.freeId(id); export default generateId;