{"version":3,"file":"ObservablePoint.mjs","sources":["../../../src/maths/point/ObservablePoint.ts"],"sourcesContent":["import type { PointData } from './PointData';\nimport type { PointLike } from './PointLike';\n\n// eslint-disable-next-line max-len\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type, requireExport/require-export-jsdoc, requireMemberAPI/require-member-api-doc\nexport interface ObservablePoint extends PixiMixins.ObservablePoint { }\n\n/**\n * Observer used to listen for observable point changes.\n * Provides callback mechanism for point value updates.\n * @example\n * ```ts\n * // Basic observer implementation\n * const observer: Observer<ObservablePoint> = {\n *     _onUpdate: (point) => {\n *         console.log(`Point updated to (${point.x}, ${point.y})`);\n *     }\n * };\n *\n * // Create observable point with observer\n * const point = new ObservablePoint(observer, 100, 100);\n *\n * // Observer will be notified on changes\n * point.x = 200; // Logs: Point updated to (200, 100)\n * ```\n * @remarks\n * - Used internally by ObservablePoint\n * - Triggered on x/y changes\n * - Can track multiple points\n * - Useful for change detection\n * @typeParam T - The type of point being observed\n * @see {@link ObservablePoint} The observable point class\n * @see {@link PointLike} For point interface\n * @category maths\n * @standard\n */\nexport interface Observer<T>\n{\n    /**\n     * Callback to call when the point has updated.\n     * Triggered whenever x or y coordinates change.\n     * @param point - The point that was updated\n     */\n    _onUpdate: (point?: T) => void;\n}\n\n/**\n * The ObservablePoint object represents a location in a two-dimensional coordinate system.\n * Triggers a callback when its position changes.\n *\n * The x and y properties represent the position on the horizontal and vertical axes, respectively.\n * @example\n * ```ts\n * // Basic observable point usage\n * const point = new ObservablePoint(\n *     { _onUpdate: (p) => console.log(`Updated to (${p.x}, ${p.y})`) },\n *     100, 100\n * );\n *\n * // Update triggers callback\n * point.x = 200; // Logs: Updated to (200, 100)\n * point.y = 300; // Logs: Updated to (200, 300)\n *\n * // Set both coordinates\n * point.set(50, 50); // Logs: Updated to (50, 50)\n * ```\n * @see {@link Point} For non-observable version\n * @see {@link Observer} For observer interface\n * @see {@link PointLike} For point interface\n * @category maths\n * @standard\n */\nexport class ObservablePoint implements PointLike\n{\n    /** @ignore */\n    public _x: number;\n    /** @ignore */\n    public _y: number;\n\n    /** This object used to call the `onUpdate` callback when the point changes. */\n    private readonly _observer: Observer<ObservablePoint>;\n\n    /**\n     * Creates a new `ObservablePoint`\n     * @param observer - Observer to pass to listen for change events.\n     * @param {number} [x=0] - position of the point on the x axis\n     * @param {number} [y=0] - position of the point on the y axis\n     */\n    constructor(observer: Observer<ObservablePoint>, x?: number, y?: number)\n    {\n        this._x = x || 0;\n        this._y = y || 0;\n\n        this._observer = observer;\n    }\n\n    /**\n     * Creates a clone of this point.\n     * @example\n     * ```ts\n     * // Basic cloning\n     * const point = new ObservablePoint(observer, 100, 200);\n     * const copy = point.clone();\n     *\n     * // Clone with new observer\n     * const newObserver = {\n     *     _onUpdate: (p) => console.log(`Clone updated: (${p.x}, ${p.y})`)\n     * };\n     * const watched = point.clone(newObserver);\n     *\n     * // Verify independence\n     * watched.set(300, 400); // Only triggers new observer\n     * ```\n     * @param observer - Optional observer to pass to the new observable point\n     * @returns A copy of this observable point\n     * @see {@link ObservablePoint.copyFrom} For copying into existing point\n     * @see {@link Observer} For observer interface details\n     */\n    public clone(observer?: Observer<ObservablePoint>): ObservablePoint\n    {\n        return new ObservablePoint(observer ?? this._observer, this._x, this._y);\n    }\n\n    /**\n     * Sets the point to a new x and y position.\n     *\n     * If y is omitted, both x and y will be set to x.\n     * @example\n     * ```ts\n     * // Basic position setting\n     * const point = new ObservablePoint(observer);\n     * point.set(100, 200);\n     *\n     * // Set both x and y to same value\n     * point.set(50); // x=50, y=50\n     * ```\n     * @param x - Position on the x axis\n     * @param y - Position on the y axis, defaults to x\n     * @returns The point instance itself\n     * @see {@link ObservablePoint.copyFrom} For copying from another point\n     * @see {@link ObservablePoint.equals} For comparing positions\n     */\n    public set(x = 0, y = x): this\n    {\n        if (this._x !== x || this._y !== y)\n        {\n            this._x = x;\n            this._y = y;\n            this._observer._onUpdate(this);\n        }\n\n        return this;\n    }\n\n    /**\n     * Copies x and y from the given point into this point.\n     * @example\n     * ```ts\n     * // Basic copying\n     * const source = new ObservablePoint(observer, 100, 200);\n     * const target = new ObservablePoint();\n     * target.copyFrom(source);\n     *\n     * // Copy and chain operations\n     * const point = new ObservablePoint()\n     *     .copyFrom(source)\n     *     .set(x + 50, y + 50);\n     *\n     * // Copy from any PointData\n     * const data = { x: 10, y: 20 };\n     * point.copyFrom(data);\n     * ```\n     * @param p - The point to copy from\n     * @returns The point instance itself\n     * @see {@link ObservablePoint.copyTo} For copying to another point\n     * @see {@link ObservablePoint.clone} For creating new point copy\n     */\n    public copyFrom(p: PointData): this\n    {\n        if (this._x !== p.x || this._y !== p.y)\n        {\n            this._x = p.x;\n            this._y = p.y;\n            this._observer._onUpdate(this);\n        }\n\n        return this;\n    }\n\n    /**\n     * Copies this point's x and y into the given point.\n     * @example\n     * ```ts\n     * // Basic copying\n     * const source = new ObservablePoint(100, 200);\n     * const target = new ObservablePoint();\n     * source.copyTo(target);\n     * ```\n     * @param p - The point to copy to. Can be any type that is or extends `PointLike`\n     * @returns The point (`p`) with values updated\n     * @see {@link ObservablePoint.copyFrom} For copying from another point\n     * @see {@link ObservablePoint.clone} For creating new point copy\n     */\n    public copyTo<T extends PointLike>(p: T): T\n    {\n        p.set(this._x, this._y);\n\n        return p;\n    }\n\n    /**\n     * Checks if another point is equal to this point.\n     *\n     * Compares x and y values using strict equality.\n     * @example\n     * ```ts\n     * // Basic equality check\n     * const p1 = new ObservablePoint(100, 200);\n     * const p2 = new ObservablePoint(100, 200);\n     * console.log(p1.equals(p2)); // true\n     *\n     * // Compare with PointData\n     * const data = { x: 100, y: 200 };\n     * console.log(p1.equals(data)); // true\n     *\n     * // Check different points\n     * const p3 = new ObservablePoint(200, 300);\n     * console.log(p1.equals(p3)); // false\n     * ```\n     * @param p - The point to check\n     * @returns `true` if both `x` and `y` are equal\n     * @see {@link ObservablePoint.copyFrom} For making points equal\n     * @see {@link PointData} For point data interface\n     */\n    public equals(p: PointData): boolean\n    {\n        return (p.x === this._x) && (p.y === this._y);\n    }\n\n    // #if _DEBUG\n    public toString(): string\n    {\n        return `[pixi.js/math:ObservablePoint x=${this._x} y=${this._y} scope=${this._observer}]`;\n    }\n    // #endif\n\n    /**\n     * Position of the observable point on the x axis.\n     * Triggers observer callback when value changes.\n     * @example\n     * ```ts\n     * // Basic x position\n     * const point = new ObservablePoint(observer);\n     * point.x = 100; // Triggers observer\n     *\n     * // Use in calculations\n     * const width = rightPoint.x - leftPoint.x;\n     * ```\n     * @default 0\n     */\n    get x(): number\n    {\n        return this._x;\n    }\n\n    set x(value: number)\n    {\n        if (this._x !== value)\n        {\n            this._x = value;\n            this._observer._onUpdate(this);\n        }\n    }\n\n    /**\n     * Position of the observable point on the y axis.\n     * Triggers observer callback when value changes.\n     * @example\n     * ```ts\n     * // Basic y position\n     * const point = new ObservablePoint(observer);\n     * point.y = 200; // Triggers observer\n     *\n     * // Use in calculations\n     * const height = bottomPoint.y - topPoint.y;\n     * ```\n     * @default 0\n     */\n    get y(): number\n    {\n        return this._y;\n    }\n\n    set y(value: number)\n    {\n        if (this._y !== value)\n        {\n            this._y = value;\n            this._observer._onUpdate(this);\n        }\n    }\n}\n"],"names":[],"mappings":";AAwEO,MAAM,eAAA,CACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAeI,WAAA,CAAY,QAAA,EAAqC,CAAA,EAAY,CAAA,EAC7D;AACI,IAAA,IAAA,CAAK,KAAK,CAAA,IAAK,CAAA;AACf,IAAA,IAAA,CAAK,KAAK,CAAA,IAAK,CAAA;AAEf,IAAA,IAAA,CAAK,SAAA,GAAY,QAAA;AAAA,EACrB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAwBO,MAAM,QAAA,EACb;AACI,IAAA,OAAO,IAAI,gBAAgB,QAAA,IAAY,IAAA,CAAK,WAAW,IAAA,CAAK,EAAA,EAAI,KAAK,EAAE,CAAA;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAqBO,GAAA,CAAI,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EACtB;AACI,IAAA,IAAI,IAAA,CAAK,EAAA,KAAO,CAAA,IAAK,IAAA,CAAK,OAAO,CAAA,EACjC;AACI,MAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,MAAA,IAAA,CAAK,EAAA,GAAK,CAAA;AACV,MAAA,IAAA,CAAK,SAAA,CAAU,UAAU,IAAI,CAAA;AAAA,IACjC;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBO,SAAS,CAAA,EAChB;AACI,IAAA,IAAI,KAAK,EAAA,KAAO,CAAA,CAAE,KAAK,IAAA,CAAK,EAAA,KAAO,EAAE,CAAA,EACrC;AACI,MAAA,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AACZ,MAAA,IAAA,CAAK,KAAK,CAAA,CAAE,CAAA;AACZ,MAAA,IAAA,CAAK,SAAA,CAAU,UAAU,IAAI,CAAA;AAAA,IACjC;AAEA,IAAA,OAAO,IAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBO,OAA4B,CAAA,EACnC;AACI,IAAA,CAAA,CAAE,GAAA,CAAI,IAAA,CAAK,EAAA,EAAI,IAAA,CAAK,EAAE,CAAA;AAEtB,IAAA,OAAO,CAAA;AAAA,EACX;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA0BO,OAAO,CAAA,EACd;AACI,IAAA,OAAQ,EAAE,CAAA,KAAM,IAAA,CAAK,EAAA,IAAQ,CAAA,CAAE,MAAM,IAAA,CAAK,EAAA;AAAA,EAC9C;AAAA,EAGO,QAAA,GACP;AACI,IAAA,OAAO,CAAA,gCAAA,EAAmC,KAAK,EAAE,CAAA,GAAA,EAAM,KAAK,EAAE,CAAA,OAAA,EAAU,KAAK,SAAS,CAAA,CAAA,CAAA;AAAA,EAC1F;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiBA,IAAI,CAAA,GACJ;AACI,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,EAChB;AAAA,EAEA,IAAI,EAAE,KAAA,EACN;AACI,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAChB;AACI,MAAA,IAAA,CAAK,EAAA,GAAK,KAAA;AACV,MAAA,IAAA,CAAK,SAAA,CAAU,UAAU,IAAI,CAAA;AAAA,IACjC;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAgBA,IAAI,CAAA,GACJ;AACI,IAAA,OAAO,IAAA,CAAK,EAAA;AAAA,EAChB;AAAA,EAEA,IAAI,EAAE,KAAA,EACN;AACI,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAChB;AACI,MAAA,IAAA,CAAK,EAAA,GAAK,KAAA;AACV,MAAA,IAAA,CAAK,SAAA,CAAU,UAAU,IAAI,CAAA;AAAA,IACjC;AAAA,EACJ;AACJ;;;;"}