{"version":3,"file":"Runner.mjs","sources":["../src/Runner.ts"],"sourcesContent":["/**\n * A Runner is a highly performant and simple alternative to signals. Best used in situations\n * where events are dispatched to many objects at high frequency (say every frame!)\n *\n * Like a signal:\n *\n * ```js\n * import { Runner } from 'pixijs/runner';\n *\n * const myObject = {\n *     loaded: new Runner('loaded'),\n * };\n *\n * const listener = {\n *     loaded: function() {\n *         // Do something when loaded\n *     }\n * };\n *\n * myObject.loaded.add(listener);\n *\n * myObject.loaded.emit();\n * ```\n *\n * Or for handling calling the same function on many items:\n *\n * ```js\n * import { Runner } from 'pixijs/runner';\n *\n * const myGame = {\n *     update: new Runner('update'),\n * };\n *\n * const gameObject = {\n *     update: function(time) {\n *         // Update my gamey state\n *     },\n * };\n *\n * myGame.update.add(gameObject);\n *\n * myGame.update.emit(time);\n * ```\n * @memberof PIXI\n */\nexport class Runner\n{\n    public items: any[];\n    private _name: string;\n    private _aliasCount: number;\n\n    /**\n     * @param name - The function name that will be executed on the listeners added to this Runner.\n     */\n    constructor(name: string)\n    {\n        this.items = [];\n        this._name = name;\n        this._aliasCount = 0;\n    }\n\n    /* eslint-disable jsdoc/require-param, jsdoc/check-param-names */\n    /**\n     * Dispatch/Broadcast Runner to all listeners added to the queue.\n     * @param {...any} params - (optional) parameters to pass to each listener\n     */\n    /*  eslint-enable jsdoc/require-param, jsdoc/check-param-names */\n    public emit(a0?: unknown, a1?: unknown, a2?: unknown, a3?: unknown,\n        a4?: unknown, a5?: unknown, a6?: unknown, a7?: unknown): this\n    {\n        if (arguments.length > 8)\n        {\n            throw new Error('max arguments reached');\n        }\n\n        const { name, items } = this;\n\n        this._aliasCount++;\n\n        for (let i = 0, len = items.length; i < len; i++)\n        {\n            items[i][name](a0, a1, a2, a3, a4, a5, a6, a7);\n        }\n\n        if (items === this.items)\n        {\n            this._aliasCount--;\n        }\n\n        return this;\n    }\n\n    private ensureNonAliasedItems(): void\n    {\n        if (this._aliasCount > 0 && this.items.length > 1)\n        {\n            this._aliasCount = 0;\n            this.items = this.items.slice(0);\n        }\n    }\n\n    /**\n     * Add a listener to the Runner\n     *\n     * Runners do not need to have scope or functions passed to them.\n     * All that is required is to pass the listening object and ensure that it has contains a function that has the same name\n     * as the name provided to the Runner when it was created.\n     *\n     * E.g. A listener passed to this Runner will require a 'complete' function.\n     *\n     * ```js\n     * import { Runner } from 'pixijs/runner';\n     *\n     * const complete = new Runner('complete');\n     * ```\n     *\n     * The scope used will be the object itself.\n     * @param {any} item - The object that will be listening.\n     */\n    public add(item: unknown): this\n    {\n        if ((item as any)[this._name])\n        {\n            this.ensureNonAliasedItems();\n            this.remove(item);\n            this.items.push(item);\n        }\n\n        return this;\n    }\n\n    /**\n     * Remove a single listener from the dispatch queue.\n     * @param {any} item - The listener that you would like to remove.\n     */\n    public remove(item: unknown): this\n    {\n        const index = this.items.indexOf(item);\n\n        if (index !== -1)\n        {\n            this.ensureNonAliasedItems();\n            this.items.splice(index, 1);\n        }\n\n        return this;\n    }\n\n    /**\n     * Check to see if the listener is already in the Runner\n     * @param {any} item - The listener that you would like to check.\n     */\n    public contains(item: unknown): boolean\n    {\n        return this.items.includes(item);\n    }\n\n    /** Remove all listeners from the Runner */\n    public removeAll(): this\n    {\n        this.ensureNonAliasedItems();\n        this.items.length = 0;\n\n        return this;\n    }\n\n    /** Remove all references, don't use after this. */\n    public destroy(): void\n    {\n        this.removeAll();\n        this.items = null;\n        this._name = null;\n    }\n\n    /**\n     * `true` if there are no this Runner contains no listeners\n     * @readonly\n     */\n    public get empty(): boolean\n    {\n        return this.items.length === 0;\n    }\n\n    /**\n     * The name of the runner.\n     * @readonly\n     */\n    public get name(): string\n    {\n        return this._name;\n    }\n}\n\nObject.defineProperties(Runner.prototype, {\n    /**\n     * Alias for `emit`\n     * @memberof PIXI.Runner#\n     * @method dispatch\n     * @see PIXI.Runner#emit\n     */\n    dispatch: { value: Runner.prototype.emit },\n    /**\n     * Alias for `emit`\n     * @memberof PIXI.Runner#\n     * @method run\n     * @see PIXI.Runner#emit\n     */\n    run: { value: Runner.prototype.emit },\n});\n"],"names":[],"mappings":"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"}