Home Reference Source

js/util/ObservableMap.js

import { ObservableEntry, WaitEntry } from './ObservableEntry.js'

export default class ObservableMap {
  constructor () {
    /**
     * @type {Map<string, ObservableEntry>}
     */
    this.observableEntries = new Map()
  }

  get (key) {
    const observableEntry = this.observableEntries.get(key)
    return observableEntry.get()
  }

  set (key, val) {
    if (!this.has(key)) {
      this.observableEntries.set(key, new ObservableEntry())
    }

    const observableEntry = this.observableEntries.get(key)
    observableEntry.set(val)
    return this
  }

  delete (key) {
    return this.observableEntries.delete(key)
  }

  has (key) {
    return this.observableEntries.has(key)
  }

  wait (key) {
    if (!this.has(key)) {
      this.observableEntries.set(key, new ObservableEntry())
    }

    const observableEntry = this.observableEntries.get(key)
    return new WaitEntry({ observableEntry })
  }

  clear () {
    this.observableEntries.clear()
  }
}