{"version":3,"file":"TickerListener.mjs","sources":["../../src/ticker/TickerListener.ts"],"sourcesContent":["import type { Ticker, TickerCallback } from './Ticker';\n\n/**\n * Internal class for handling the priority sorting of ticker handlers.\n * @private\n * @class\n */\nexport class TickerListener<T = any>\n{\n    /** The current priority. */\n    public priority: number;\n    /** The next item in chain. */\n    public next: TickerListener = null;\n    /** The previous item in chain. */\n    public previous: TickerListener = null;\n\n    /** The handler function to execute. */\n    private _fn: TickerCallback<T>;\n    /** The calling to execute. */\n    private _context: T;\n    /** If this should only execute once. */\n    private readonly _once: boolean;\n    /** `true` if this listener has been destroyed already. */\n    private _destroyed = false;\n\n    /**\n     * Constructor\n     * @private\n     * @param fn - The listener function to be added for one update\n     * @param context - The listener context\n     * @param priority - The priority for emitting\n     * @param once - If the handler should fire once\n     */\n    constructor(fn: TickerCallback<T>, context: T = null, priority = 0, once = false)\n    {\n        this._fn = fn;\n        this._context = context;\n        this.priority = priority;\n        this._once = once;\n    }\n\n    /**\n     * Simple compare function to figure out if a function and context match.\n     * @param fn - The listener function to be added for one update\n     * @param context - The listener context\n     * @returns `true` if the listener match the arguments\n     */\n    public match(fn: TickerCallback<T>, context: any = null): boolean\n    {\n        return this._fn === fn && this._context === context;\n    }\n\n    /**\n     * Emit by calling the current function.\n     * @param ticker - The ticker emitting.\n     * @returns Next ticker\n     */\n    public emit(ticker: Ticker): TickerListener\n    {\n        if (this._fn)\n        {\n            if (this._context)\n            {\n                this._fn.call(this._context, ticker);\n            }\n            else\n            {\n                (this as TickerListener<any>)._fn(ticker);\n            }\n        }\n\n        const redirect = this.next;\n\n        if (this._once)\n        {\n            this.destroy(true);\n        }\n\n        // Soft-destroying should remove\n        // the next reference\n        if (this._destroyed)\n        {\n            this.next = null;\n        }\n\n        return redirect;\n    }\n\n    /**\n     * Connect to the list.\n     * @param previous - Input node, previous listener\n     */\n    public connect(previous: TickerListener): void\n    {\n        this.previous = previous;\n        if (previous.next)\n        {\n            previous.next.previous = this;\n        }\n        this.next = previous.next;\n        previous.next = this;\n    }\n\n    /**\n     * Destroy and don't use after this.\n     * @param hard - `true` to remove the `next` reference, this\n     *        is considered a hard destroy. Soft destroy maintains the next reference.\n     * @returns The listener to redirect while emitting or removing.\n     */\n    public destroy(hard = false): TickerListener\n    {\n        this._destroyed = true;\n        this._fn = null;\n        this._context = null;\n\n        // Disconnect, hook up next and previous\n        if (this.previous)\n        {\n            this.previous.next = this.next;\n        }\n\n        if (this.next)\n        {\n            this.next.previous = this.previous;\n        }\n\n        // Redirect to the next item\n        const redirect = this.next;\n\n        // Remove references\n        this.next = hard ? null : redirect;\n        this.previous = null;\n\n        return redirect;\n    }\n}\n"],"names":[],"mappings":";AAOO,MAAM,cACb,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAyBI,YAAY,EAAuB,EAAA,OAAA,GAAa,MAAM,QAAW,GAAA,CAAA,EAAG,OAAO,KAC3E,EAAA;AAtBA;AAAA,IAAA,IAAA,CAAO,IAAuB,GAAA,IAAA,CAAA;AAE9B;AAAA,IAAA,IAAA,CAAO,QAA2B,GAAA,IAAA,CAAA;AASlC;AAAA,IAAA,IAAA,CAAQ,UAAa,GAAA,KAAA,CAAA;AAYjB,IAAA,IAAA,CAAK,GAAM,GAAA,EAAA,CAAA;AACX,IAAA,IAAA,CAAK,QAAW,GAAA,OAAA,CAAA;AAChB,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAA;AAChB,IAAA,IAAA,CAAK,KAAQ,GAAA,IAAA,CAAA;AAAA,GACjB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,KAAA,CAAM,EAAuB,EAAA,OAAA,GAAe,IACnD,EAAA;AACI,IAAA,OAAO,IAAK,CAAA,GAAA,KAAQ,EAAM,IAAA,IAAA,CAAK,QAAa,KAAA,OAAA,CAAA;AAAA,GAChD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOO,KAAK,MACZ,EAAA;AACI,IAAA,IAAI,KAAK,GACT,EAAA;AACI,MAAA,IAAI,KAAK,QACT,EAAA;AACI,QAAA,IAAA,CAAK,GAAI,CAAA,IAAA,CAAK,IAAK,CAAA,QAAA,EAAU,MAAM,CAAA,CAAA;AAAA,OAGvC,MAAA;AACI,QAAC,IAAA,CAA6B,IAAI,MAAM,CAAA,CAAA;AAAA,OAC5C;AAAA,KACJ;AAEA,IAAA,MAAM,WAAW,IAAK,CAAA,IAAA,CAAA;AAEtB,IAAA,IAAI,KAAK,KACT,EAAA;AACI,MAAA,IAAA,CAAK,QAAQ,IAAI,CAAA,CAAA;AAAA,KACrB;AAIA,IAAA,IAAI,KAAK,UACT,EAAA;AACI,MAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA;AAAA,KAChB;AAEA,IAAO,OAAA,QAAA,CAAA;AAAA,GACX;AAAA;AAAA;AAAA;AAAA;AAAA,EAMO,QAAQ,QACf,EAAA;AACI,IAAA,IAAA,CAAK,QAAW,GAAA,QAAA,CAAA;AAChB,IAAA,IAAI,SAAS,IACb,EAAA;AACI,MAAA,QAAA,CAAS,KAAK,QAAW,GAAA,IAAA,CAAA;AAAA,KAC7B;AACA,IAAA,IAAA,CAAK,OAAO,QAAS,CAAA,IAAA,CAAA;AACrB,IAAA,QAAA,CAAS,IAAO,GAAA,IAAA,CAAA;AAAA,GACpB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQO,OAAA,CAAQ,OAAO,KACtB,EAAA;AACI,IAAA,IAAA,CAAK,UAAa,GAAA,IAAA,CAAA;AAClB,IAAA,IAAA,CAAK,GAAM,GAAA,IAAA,CAAA;AACX,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAGhB,IAAA,IAAI,KAAK,QACT,EAAA;AACI,MAAK,IAAA,CAAA,QAAA,CAAS,OAAO,IAAK,CAAA,IAAA,CAAA;AAAA,KAC9B;AAEA,IAAA,IAAI,KAAK,IACT,EAAA;AACI,MAAK,IAAA,CAAA,IAAA,CAAK,WAAW,IAAK,CAAA,QAAA,CAAA;AAAA,KAC9B;AAGA,IAAA,MAAM,WAAW,IAAK,CAAA,IAAA,CAAA;AAGtB,IAAK,IAAA,CAAA,IAAA,GAAO,OAAO,IAAO,GAAA,QAAA,CAAA;AAC1B,IAAA,IAAA,CAAK,QAAW,GAAA,IAAA,CAAA;AAEhB,IAAO,OAAA,QAAA,CAAA;AAAA,GACX;AACJ;;;;"}