<commit_before>/**
 * localStorageの取得と更新、統合と削除をします。
 * @example
 * import Storage from './Storage';
 * const storage = new Storage();
 */
export default class Storage {
  constructor() {
    /**
     * @property {string} key - ローカルストレージのキー
     * @property {object} storage - ローカルストレージ値の一時保存オブジェクト
     */
    this.key = 'APP';
    this.storage = {};

    this.fetch();
    this.update();
  }

  /**
   * ローカルストレージを取得します。
   */
  fetch() {
    const item = JSON.parse(localStorage.getItem(this.key));
    const isNil = item === undefined || item === null;

    if (!isNil) {
      this.storage = Object.assign(this.storage, item);
    }

    return this;
  }

  /**
   * ローカルストレージを更新します。
   */
  update() {
    localStorage.setItem(this.key, JSON.stringify(this.storage));
    return this;
  }

  /**
   * ストレージオブジェクトを統合して、ローカルストレージを更新します。
   * @param {Object} storage - 統合するキーと値のオブジェクト
   * @example
   * storage.marge({ foo: 'foo', bar: 'bar' });
   */
  marge(storage) {
    this.storage = Object.assign(this.storage, storage);
    this.update();
    return this;
  }

  /**
   * オブジェクトからキーを削除して、ローカルストレージを更新します。
   * @param {String} key - 削除するキー
   * @example
   * storage.remove('foo');
   */
  remove(removeKey) {
    const storage = Object.keys(this.storage).reduce((results, key) => {
      const result = results;

      if (removeKey !== key) {
        result[key] = this.storage[key];
      }

      return result;
    }, {});

    this.storage = storage;
    this.update();
    return this;
  }

  /**
   * ローカルストレージを空にします。
   */
  clear() {
    this.storage = {};
    this.update();
    return this;
  }

  /**
   * ローカルストレージが更新されたらコールバック関数を実行する。
   * @param {function} callback
   * @example
   * storage.watch(watches => {
   *   console.log(watches.newValue);
   * });
   */
  watch(callback) {
    window.addEventListener('storage', e => {
      const { key } = e;
      const matchKey = key === this.key;

      if (matchKey) {
        callback(e);
      }
    });
  }

  /**
   * ローカルストレージが使用できるか判定します。
   * @return 使用できるかの真偽値
   * @example
   * const isStorageAvailable = Storage.isAvailable();<commit_msg>Improve: プライベート変数にして上書きできないようにする<commit_after>const KEY = 'APP';
let list = {};

/**
 * localStorageの取得と更新、統合と削除をします。
 * @example
 * import Storage from './domain/Storage';
 */
export default class Storage {
  constructor() {
    this.fetch();
    this.update();
  }

  /**
   * ローカルストレージの値を返します。
   * @return {Object} list
   * @example
   * const storageList = Storage.list;
   */
  static get list() {
    return list;
  }

  /**
   * ローカルストレージを取得します。
   */
  static fetch() {
    const item = JSON.parse(localStorage.getItem(KEY));
    const isNil = item === undefined || item === null;

    if (!isNil) {
      list = Object.assign(list, item);
    }

    return this;
  }

  /**
   * ローカルストレージを更新します。
   */
  static update() {
    localStorage.setItem(KEY, JSON.stringify(list));
    return this;
  }

  /**
   * ストレージオブジェクトを統合して、ローカルストレージを更新します。
   * @param {Object} storage - 統合するキーと値のオブジェクト
   * @example
   * Storage.marge({ foo: 'foo', bar: 'bar' });
   */
  static marge(storage) {
    list = Object.assign(storage, storage);
    this.update();
    return this;
  }

  /**
   * オブジェクトからキーを削除して、ローカルストレージを更新します。
   * @param {String} key - 削除するキー
   * @example
   * Storage.remove('foo');
   */
  static remove(removeKey) {
    const storage = Object.keys(list).reduce((results, key) => {
      const result = results;

      if (removeKey !== key) {
        result[key] = list[key];
      }

      return result;
    }, {});

    list = storage;
    this.update();
    return this;
  }

  /**
   * ローカルストレージを空にします。
   */
  static clear() {
    list = {};
    this.update();
    return this;
  }

  /**
   * ローカルストレージが更新されたらコールバック関数を実行する。
   * @param {function} callback
   * @example
   * Storage.watch(watches => {
   *   console.log(watches.newValue);
   * });
   */
  static watch(callback) {
    window.addEventListener('storage', e => {
      const { key } = e;
      const matchKey = key === KEY;

      if (matchKey) {
        callback(e);
      }
    });
  }

  /**
   * ローカルストレージが使用できるか判定します。
   * @return 使用できるかの真偽値
   * @example
   * const isStorageAvailable = Storage.isAvailable();
{'fraction_non_alphanumeric': 0.15882770030725596, 'fraction_numerical': 0.0, 'mean_word_length': 2.4294975688816858, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 9, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '7197947', 'n_tokens_mistral': 1783, 'n_tokens_neox': 1668, 'n_words': 270}