import assocIndexOf from './assocIndexOf.js'

class ListCache {

  /**
   * Creates an list cache object.
   * 创建一个列表缓存对象。
   * @private
   * @constructor
   * @param {Array} [entries] 要缓存的键值对。
   */
  constructor(entries) {
    let index = -1
    const length = entries == null ? 0 : entries.length

    this.clear()
    while (++index < length) {
      const entry = entries[index]
      this.set(entry[0], entry[1])
    }
  }

  /**
   * Removes all key-value entries from the list cache.
   * 从列表缓存中删除所有键值项。
   * @memberOf ListCache
   */
  clear() {
    this.__data__ = []
    this.size = 0
  }

  /**
   * Removes `key` and its value from the list cache.
   * 从列表缓存中删除' key '及其值。
   * @memberOf ListCache
   * @param {string} key 要删除的值的键。
   * @returns {boolean} 如果条目被删除，则返回“true”，否则返回“false”。
   */
  delete(key) {
    const data = this.__data__
    const index = assocIndexOf(data, key)

    if (index < 0) {
      return false
    }
    const lastIndex = data.length - 1
    if (index == lastIndex) {
      data.pop()
    } else {
      data.splice(index, 1)
    }
    --this.size
    return true
  }

  /**
   * Gets the list cache value for `key`.
   * 获取' key '的列表缓存值。
   * @memberOf ListCache
   * @param {string} key 要获取的值的键。
   * @returns {*} 返回条目值。
   */
  get(key) {
    const data = this.__data__
    const index = assocIndexOf(data, key)
    return index < 0 ? undefined : data[index][1]
  }

  /**
   * Checks if a list cache value for `key` exists.
   * 检查' key '的列表缓存值是否存在。
   * @memberOf ListCache
   * @param {string} key 输入键要检查。
   * @returns {boolean} 如果' key '的条目存在，则返回' true '，否则返回' false '。
   */
  has(key) {
    return assocIndexOf(this.__data__, key) > -1
  }

  /**
   * Sets the list cache `key` to `value`.
   * 将列表缓存“键”设置为“值”。
   * @memberOf ListCache
   * @param {string} key 要设置的值的键
   * @param {*} value 要设置的值。
   * @returns {Object} 返回列表缓存实例。
   */
  set(key, value) {
    const data = this.__data__
    const index = assocIndexOf(data, key)

    if (index < 0) {
      ++this.size
      data.push([key, value])
    } else {
      data[index][1] = value
    }
    return this
  }
}

export default ListCache
