Source: utils/memoizer.js

/** Memoizer class. **/

import { IssueError } from '../issues/issues'

/**
 * Superclass for property memoization until we can get away with private fields.
 */
export default class Memoizer {
  /**
   * Map containing memoized properties (string --> any).
   *
   * @type {Map}
   * @private
   */
  _memoizedProperties

  /**
   * Constructor.
   */
  constructor() {
    this._memoizedProperties = new Map()
  }

  /**
   * Memoize a property.
   *
   * @template T
   * @param {string} propertyName The property name.
   * @param {function() : T} valueComputer A function to compute the property's value.
   * @returns {T} The computed value.
   * @protected
   */
  _memoize(propertyName, valueComputer) {
    if (!propertyName) {
      IssueError.generateAndThrowInternalError('Invalid property name in Memoizer subclass.')
    }
    if (this._memoizedProperties.has(propertyName)) {
      return this._memoizedProperties.get(propertyName)
    }
    const value = valueComputer()
    this._memoizedProperties.set(propertyName, value)
    return value
  }
}