{"version":3,"sources":["../../../packages/core/data/disposable.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB;;OAEG;IACH,OAAO,IAAI,IAAI,CAAC;CACnB;AAED,oBAAY,kBAAkB,GAAG,OAAO,CAAC,MAAM,GAAG,UAAU,CAAC;AAE7D,MAAM,WAAW,0BAA0B;IACvC,CAAC,WAAW,EAAE,kBAAkB,EAAE,GAAG,mBAAmB,CAAC;IACzD,CAAC,UAAU,EAAE,kBAAkB,GAAG,mBAAmB,CAAC;CACzD;AAED;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IAChC;;;;OAIG;IACH,kBAAkB,EAAE,0BAA0B,CAAC;CAClD;AAED,MAAM,WAAW,eAAgB,SAAQ,mBAAmB;IACxD;;;;OAIG;IACH,mBAAmB,IAAI,yBAAyB,CAAC;CACpD;AAED,MAAM,WAAW,yBAA0B,SAAQ,UAAU,EAAE,eAAe;IAC1E;;OAEG;IACH,UAAU,IAAI,OAAO,CAAC;CACzB;AAqBD;;;GAGG;AACH,qBAAa,0BAA2B,YAAW,yBAAyB;IACxE,OAAO,CAAC,WAAW,CAAoB;IACvC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,SAAS,CAAoC;IACrD,OAAO,CAAC,QAAQ,CAAoB;IAEpC;;OAEG;IACI,UAAU,IAAI,OAAO;IAI5B;;OAEG;IACI,kBAAkB,CAAC,UAAU,EAAE,GAAG,GAAG,0BAA0B;IAetE;;OAEG;IACI,mBAAmB,IAAI,yBAAyB;IAOvD;;;OAGG;IACI,OAAO,IAAI,IAAI;IA4BtB,OAAO,CAAC,yBAAyB;IAajC,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,0BAA0B;CAWrC;AAED;;GAEG;AACH,qBAAa,QAAS,YAAW,UAAU;IACvC,OAAO,CAAC,QAAQ,CAAa;IAE7B;;;;OAIG;gBACS,QAAQ,EAAE,MAAM,IAAI;IAIhC;;OAEG;IACI,OAAO,IAAI,IAAI;CAGzB","file":"disposable.d.ts","sourcesContent":["/**\r\n * An object that is disposable.\r\n */\r\nexport interface Disposable {\r\n    /**\r\n     * A function called on the object when it is disposed.\r\n     */\r\n    dispose(): void;\r\n}\r\n\r\nexport type ActionOrDisposable = MsftSme.Action | Disposable;\r\n\r\nexport interface RegisterForDisposeFunction {\r\n    (disposables: ActionOrDisposable[]): LifetimeManagerBase;\r\n    (disposable: ActionOrDisposable): LifetimeManagerBase;\r\n}\r\n\r\n/**\r\n * An object that can limit the lifetime of other objects. When a LifetimeManager object\r\n * is disposed, it will dispose all other objects that were registered for disposal.\r\n */\r\nexport interface LifetimeManagerBase {\r\n    /**\r\n     * Registers an object to be disposed.  It will throw if the object doesn't have dispose method.\r\n     *\r\n     * @param disposable An object to be disposed once the LifetimeManager object itself is disposed.\r\n     */\r\n    registerForDispose: RegisterForDisposeFunction;\r\n}\r\n\r\nexport interface LifetimeManager extends LifetimeManagerBase {\r\n    /**\r\n     * Create a createChildLifetime to localize the LifetimeManager.\r\n     * It will provide the function on tracking who create it and when it dispose,\r\n     * it will remove itself from Container's lifetimeManager\r\n     */\r\n    createChildLifetime(): DisposableLifetimeManager;\r\n}\r\n\r\nexport interface DisposableLifetimeManager extends Disposable, LifetimeManager {\r\n    /**\r\n     * A value indicating whether or not the lifetime is disposed.\r\n     */\r\n    isDisposed(): boolean;\r\n}\r\n\r\nfunction checkDisposeFunc(disposable: any, executeDispose: boolean) {\r\n    if (typeof disposable.dispose === 'function') {\r\n        // NOTE : Don't null the lifetime manager or in race conditions registerForDispose() will throw a\r\n        //        null exception. Internal logic in the triggerable lifetime manager handles being disposed\r\n        //        and having disposables added to it.\r\n        if (executeDispose) {\r\n            disposable.dispose();\r\n        }\r\n    } else if (typeof disposable === 'function') {\r\n        if (executeDispose) {\r\n            disposable();\r\n        }\r\n    } else {\r\n        return false;\r\n    }\r\n\r\n    return true;\r\n}\r\n\r\n/**\r\n * An object that tracks and invokes disposal callbacks. This can be used\r\n * in other classes that wish to implement LifetimeManager.\r\n */\r\nexport class TriggerableLifetimeManager implements DisposableLifetimeManager {\r\n    private disposables: Disposable[] = [];\r\n    private isDisposedInternal = false;\r\n    private isDisposing = false;\r\n    private container: TriggerableLifetimeManager = null;\r\n    private children: Disposable[] = [];\r\n\r\n    /**\r\n     * Gets a value indicating whether or not the lifetime is disposed.\r\n     */\r\n    public isDisposed(): boolean {\r\n        return this.isDisposedInternal;\r\n    }\r\n\r\n    /**\r\n     * See interface.\r\n     */\r\n    public registerForDispose(disposable: any): TriggerableLifetimeManager {\r\n        let disposables: Disposable[];\r\n        if (Array.isArray(disposable)) {\r\n            disposables = disposable;\r\n        } else {\r\n            disposables = [disposable];\r\n        }\r\n\r\n        disposables.forEach((item) => {\r\n            this.registerForDisposeInternal(item);\r\n        });\r\n\r\n        return this;\r\n    }\r\n\r\n    /**\r\n     * See interface.\r\n     */\r\n    public createChildLifetime(): DisposableLifetimeManager {\r\n        const triggerableLifeTimeManager = new TriggerableLifetimeManager();\r\n        triggerableLifeTimeManager.container = this;\r\n        this.children.push(triggerableLifeTimeManager);\r\n        return triggerableLifeTimeManager;\r\n    }\r\n\r\n    /**\r\n     * Causes the instance to regard itself as disposed, and to trigger any\r\n     * callbacks that were already registered.\r\n     */\r\n    public dispose(): void {\r\n        if (!this.isDisposedInternal) {\r\n            this.isDisposedInternal = true;\r\n            this.isDisposing = true;\r\n\r\n            // remove all children and _disposable\r\n            [this.disposables, this.children].forEach((disposables) => {\r\n                while (disposables.length) {\r\n                    const disposable = disposables.pop();\r\n                    try {\r\n                        checkDisposeFunc(disposable, true);\r\n                    } catch (err) {\r\n                        // ignore errors when running the check dispose function\r\n                    }\r\n                }\r\n            });\r\n\r\n            // check if we need to remove self from container\r\n            const container = this.container;\r\n            if (container) {\r\n                this.container = null; // break the back link\r\n                container.unregisterChildForDispose(this);\r\n            }\r\n\r\n            this.isDisposing = false;\r\n        }\r\n    }\r\n\r\n    private unregisterChildForDispose(disposable: Disposable) {\r\n        const children = this.children;\r\n        if (!this.isDisposing) {\r\n            const index = children.lastIndexOf(disposable);\r\n            if (index === (children.length - 1)) {\r\n                children.pop();\r\n            } else {\r\n                // take it self out of the container.\r\n                children.splice(index, 1);\r\n            }\r\n        }\r\n    }\r\n\r\n    private isRegistered(disposable: Disposable) {\r\n        return (this.disposables.lastIndexOf(disposable) >= 0 || this.children.lastIndexOf(disposable) >= 0);\r\n    }\r\n\r\n    private registerForDisposeInternal(disposable: Disposable): void {\r\n        let valid = !this.isDisposedInternal;\r\n\r\n        if (!disposable) {\r\n            valid = false;\r\n        }\r\n\r\n        if (valid) {\r\n            this.disposables.push(disposable);\r\n        }\r\n    }\r\n}\r\n\r\n/**\r\n * Auto disposer class used with lifetime manager.\r\n */\r\nexport class Disposer implements Disposable {\r\n    private callback: () => void;\r\n\r\n    /**\r\n     * Initializes a new instance of the Disposer class.\r\n     *\r\n     * @param callback the callback function.\r\n     */\r\n    constructor(callback: () => void) {\r\n        this.callback = callback;\r\n    }\r\n\r\n    /**\r\n     * dispose function called when lifetime is gone.\r\n     */\r\n    public dispose(): void {\r\n        this.callback();\r\n    }\r\n}\r\n"]}