/**
 * @module utils
 */

import { Type } from '../structs/Type.js' // eslint-disable-line

/**
 * YEvent describes the changes on a YType.
 */
export class YEvent {
  /**
   * @param {Type} target The changed type.
   */
  constructor (target) {
    /**
     * The type on which this event was created on.
     * @type {Type}
     */
    this.target = target
    /**
     * The current target on which the observe callback is called.
     * @type {Type}
     */
    this.currentTarget = target
  }

  /**
   * Computes the path from `y` to the changed type.
   *
   * The following property holds:
   * @example
   *   let type = y
   *   event.path.forEach(dir => {
   *     type = type.get(dir)
   *   })
   *   type === event.target // => true
   */
  get path () {
    return this.currentTarget.getPathTo(this.target)
  }
}