/**
 * LRU (Least Recently Used) 缓存实现
 * 
 * 用途:
 * - 用于缓存有限数量的键值对数据
 * - 适用于需要限制内存使用的场景
 * - 常用于性能优化,避免重复计算
 */

/**
 * LRU缓存类
 * 
 * 设计说明:
 * - 采用Map数据结构存储键值对
 * - 通过size属性跟踪当前缓存数量
 * - 支持最大容量限制
 * 
 * 使用示例:
 * ```ts
 * const cache = new Lru(100); 
 * cache.add('key', 'value');
 * const value = cache.get('key');
 * ```
 */
export default class Lru<K, V> {
  /** 缓存最大容量 */
  private max: number;
  /** 当前缓存数量 */
  private size: number;
  /** 缓存池,使用Map存储键值对 */
  private pool: Map<K, V>;

  /**
   * 构造函数
   * @param max - 缓存的最大容量,默认为1000
   */
  constructor(max?: number) {
    this.max = max || 1000;
    this.size = 0;
    this.pool = new Map<K, V>();
  }

  /**
   * 添加键值对到缓存
   * @param key - 缓存键
   * @param value - 缓存值
   * @returns 添加是否成功
   * 
   * 处理逻辑:
   * 1. 检查键是否存在
   * 2. 如果不存在且达到容量上限,则添加失败
   * 3. 如果键已存在,则先删除旧值
   * 4. 添加新的键值对
   */
  add(key: K, value: V): boolean {
    const isExist = this.has(key);
    // 如果该key之前不存在,并且现在数量已经超出最大值,则不再继续添加
    if (!isExist && this.size >= this.max) {
      return false;
    }
    // 已经存在则可以更新,因为不影响数量
    // 如果该key是否已经存在,则先删除
    this.delete(key);
    // 添加新值
    this.pool.set(key, value);
    this.size++;
    return true;
  }

  /**
   * 从缓存中删除指定键值对
   * @param key - 要删除的键
   */
  delete(key: K): void {
    if (this.pool.has(key)) {
      this.pool.delete(key);
      this.size--;
    }
  }

  /**
   * 检查键是否存在于缓存中
   * @param key - 要检查的键
   * @returns 是否存在
   */
  has(key: K): boolean {
    return this.pool.has(key);
  }

  /**
   * 获取缓存中指定键的值
   * @param key - 要获取的键
   * @returns 对应的值,如果不存在则返回undefined
   */
  get(key: K): V | undefined {
    if (this.pool.has(key)) {
      return this.pool.get(key);
    }
    return undefined;
  }

  /**
   * 清空缓存
   * 重置size为0并创建新的Map实例
   */
  clear(): void {
    this.size = 0;
    this.pool = new Map<K, V>();
  }
}