class Cache {
  constructor () {
    this.kv = {}
  }

  /**
   * @param {string} key
   * @param {string} value
   * @param {boolean?} noOverride
   */
  set (key, value, noOverride) {
    if (noOverride && key in this.kv) {
      throw new Error('key exists')
    }

    this.kv[key] = value
  }

  /**
   * @param {string} key
   * @return {string?}
   */
  get (key) {
    return this.kv[key] || null
  }

  /**
   * @param {string[]} keys
   */
  del (...keys) {
    for (const key of keys) {
      delete this.kv[key]
    }
  }
}

let cache = null

exports.new = function () {
  if (cache) throw new Error('cache already initiate')
  cache = new Cache()
  return cache
}

/**
 * @return {Cache}
 */
exports.get = function () {
  if (!cache) throw new Error('cache not initiate')
  return cache
}
