File size: 1,446 Bytes
7e3630c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/**
 * 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<number>();

  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;