{"version":3,"sources":["src/common/List.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,WAAW,KAAK,CAAC,KAAK,CAAE,SAAQ,WAAW;IAC7C,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;IAC9B,KAAK,IAAI,KAAK,CAAC;IACf,IAAI,IAAI,KAAK,CAAC;IAEd,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IAE3C,WAAW,IAAI,KAAK,CAAC;IACrB,UAAU,IAAI,KAAK,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;IAC/B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE,CAAC;IAC9C,KAAK,IAAI,IAAI,CAAC;IAEd,MAAM,IAAI,MAAM,CAAC;IAEjB,OAAO,CAAC,aAAa,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;IAChD,SAAS,CAAC,eAAe,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;IACpD,UAAU,CAAC,gBAAgB,EAAE,MAAM,IAAI,GAAG,WAAW,CAAC;IAEtD,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAEjC,OAAO,IAAI,KAAK,EAAE,CAAC;IAEnB,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO,CAAC;IACjE,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,GAAG,OAAO,CAAC;IACjD,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC9D,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC;IACnE,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACtE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IAChE,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACpE,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;CAC5C;AAED,qBAAa,IAAI,CAAC,KAAK,CAAE,YAAW,KAAK,CAAC,KAAK,CAAC;IAC5C,OAAO,CAAC,QAAQ,CAAU;IAC1B,OAAO,CAAC,yBAAyB,CAAa;IAC9C,OAAO,CAAC,oBAAoB,CAAqC;IACjE,OAAO,CAAC,uBAAuB,CAAqC;IACpE,OAAO,CAAC,yBAAyB,CAAqC;IACtE,OAAO,CAAC,iBAAiB,CAAgB;gBAEtB,IAAI,CAAC,EAAE,KAAK,EAAE;IAU1B,GAAG,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK;IAK7B,KAAK,IAAI,KAAK;IAId,IAAI,IAAI,KAAK;IAIb,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,IAAI;IAKtB,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI;IAY1C,WAAW,IAAI,KAAK;IAKpB,UAAU,IAAI,KAAK;IAKnB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK;IAK9B,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,EAAE;IAO7C,KAAK,IAAI,IAAI;IAKb,MAAM,IAAI,MAAM;IAKhB,OAAO,CAAC,aAAa,EAAE,MAAM,IAAI,GAAG,WAAW;IAc/C,SAAS,CAAC,eAAe,EAAE,MAAM,IAAI,GAAG,WAAW;IAcnD,UAAU,CAAC,gBAAgB,EAAE,MAAM,IAAI,GAAG,WAAW;IAcrD,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAKhC,OAAO,IAAI,KAAK,EAAE;IAQlB,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,OAAO;IAShE,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,GAAG,OAAO;IAKhD,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI;IAO7D,MAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;IAUlE,KAAK,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC;IAWrE,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;IAO/D,WAAW,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,KAAK,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;IAKnE,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;IAKpB,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC;IAKtC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC;IAKxC,UAAU,IAAI,OAAO;IAIrB,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAUrC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,oBAAoB;CAS/B","file":"List.d.ts","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\r\n// Licensed under the MIT license.\r\n\r\nimport { ObjectDisposedError } from \"./Error.js\";\r\nimport { IDetachable } from \"./IDetachable.js\";\r\nimport { IStringDictionary } from \"./IDictionary.js\";\r\nimport { IDisposable } from \"./IDisposable.js\";\r\n\r\nexport interface IList<TItem> extends IDisposable {\r\n    get(itemIndex: number): TItem;\r\n    first(): TItem;\r\n    last(): TItem;\r\n\r\n    add(item: TItem): void;\r\n    insertAt(index: number, item: TItem): void;\r\n\r\n    removeFirst(): TItem;\r\n    removeLast(): TItem;\r\n    removeAt(index: number): TItem;\r\n    remove(index: number, count: number): TItem[];\r\n    clear(): void;\r\n\r\n    length(): number;\r\n\r\n    onAdded(addedCallback: () => void): IDetachable;\r\n    onRemoved(removedCallback: () => void): IDetachable;\r\n    onDisposed(disposedCallback: () => void): IDetachable;\r\n\r\n    join(seperator?: string): string;\r\n\r\n    toArray(): TItem[];\r\n\r\n    any(callback?: (item: TItem, index: number) => boolean): boolean;\r\n    all(callback: (item: TItem) => boolean): boolean;\r\n    forEach(callback: (item: TItem, index: number) => void): void;\r\n    select<T2>(callback: (item: TItem, index: number) => T2): List<T2>;\r\n    where(callback: (item: TItem, index: number) => boolean): List<TItem>;\r\n    orderBy(compareFn: (a: TItem, b: TItem) => number): List<TItem>;\r\n    orderByDesc(compareFn: (a: TItem, b: TItem) => number): List<TItem>;\r\n    clone(): List<TItem>;\r\n    concat(list: List<TItem>): List<TItem>;\r\n    concatArray(array: TItem[]): List<TItem>;\r\n}\r\n\r\nexport class List<TItem> implements IList<TItem>  {\r\n    private privList: TItem[];\r\n    private privSubscriptionIdCounter: number = 0;\r\n    private privAddSubscriptions: IStringDictionary<() => void> = {};\r\n    private privRemoveSubscriptions: IStringDictionary<() => void> = {};\r\n    private privDisposedSubscriptions: IStringDictionary<() => void> = {};\r\n    private privDisposeReason: string = null;\r\n\r\n    public constructor(list?: TItem[]) {\r\n        this.privList = [];\r\n        // copy the list rather than taking as is.\r\n        if (list) {\r\n            for (const item of list) {\r\n                this.privList.push(item);\r\n            }\r\n        }\r\n    }\r\n\r\n    public get(itemIndex: number): TItem {\r\n        this.throwIfDisposed();\r\n        return this.privList[itemIndex];\r\n    }\r\n\r\n    public first(): TItem {\r\n        return this.get(0);\r\n    }\r\n\r\n    public last(): TItem {\r\n        return this.get(this.length() - 1);\r\n    }\r\n\r\n    public add(item: TItem): void {\r\n        this.throwIfDisposed();\r\n        this.insertAt(this.privList.length, item);\r\n    }\r\n\r\n    public insertAt(index: number, item: TItem): void {\r\n        this.throwIfDisposed();\r\n        if (index === 0) {\r\n            this.privList.unshift(item);\r\n        } else if (index === this.privList.length) {\r\n            this.privList.push(item);\r\n        } else {\r\n            this.privList.splice(index, 0, item);\r\n        }\r\n        this.triggerSubscriptions(this.privAddSubscriptions);\r\n    }\r\n\r\n    public removeFirst(): TItem {\r\n        this.throwIfDisposed();\r\n        return this.removeAt(0);\r\n    }\r\n\r\n    public removeLast(): TItem {\r\n        this.throwIfDisposed();\r\n        return this.removeAt(this.length() - 1);\r\n    }\r\n\r\n    public removeAt(index: number): TItem {\r\n        this.throwIfDisposed();\r\n        return this.remove(index, 1)[0];\r\n    }\r\n\r\n    public remove(index: number, count: number): TItem[] {\r\n        this.throwIfDisposed();\r\n        const removedElements = this.privList.splice(index, count);\r\n        this.triggerSubscriptions(this.privRemoveSubscriptions);\r\n        return removedElements;\r\n    }\r\n\r\n    public clear(): void {\r\n        this.throwIfDisposed();\r\n        this.remove(0, this.length());\r\n    }\r\n\r\n    public length(): number {\r\n        this.throwIfDisposed();\r\n        return this.privList.length;\r\n    }\r\n\r\n    public onAdded(addedCallback: () => void): IDetachable {\r\n        this.throwIfDisposed();\r\n        const subscriptionId = this.privSubscriptionIdCounter++;\r\n\r\n        this.privAddSubscriptions[subscriptionId] = addedCallback;\r\n\r\n        return {\r\n            detach: (): Promise<void> => {\r\n                delete this.privAddSubscriptions[subscriptionId];\r\n                return Promise.resolve();\r\n            },\r\n        };\r\n    }\r\n\r\n    public onRemoved(removedCallback: () => void): IDetachable {\r\n        this.throwIfDisposed();\r\n        const subscriptionId = this.privSubscriptionIdCounter++;\r\n\r\n        this.privRemoveSubscriptions[subscriptionId] = removedCallback;\r\n\r\n        return {\r\n            detach: (): Promise<void> => {\r\n                delete this.privRemoveSubscriptions[subscriptionId];\r\n                return Promise.resolve();\r\n            },\r\n        };\r\n    }\r\n\r\n    public onDisposed(disposedCallback: () => void): IDetachable {\r\n        this.throwIfDisposed();\r\n        const subscriptionId = this.privSubscriptionIdCounter++;\r\n\r\n        this.privDisposedSubscriptions[subscriptionId] = disposedCallback;\r\n\r\n        return {\r\n            detach: (): Promise<void> => {\r\n                delete this.privDisposedSubscriptions[subscriptionId];\r\n                return Promise.resolve();\r\n            },\r\n        };\r\n    }\r\n\r\n    public join(seperator?: string): string {\r\n        this.throwIfDisposed();\r\n        return this.privList.join(seperator);\r\n    }\r\n\r\n    public toArray(): TItem[] {\r\n        const cloneCopy = Array<TItem>();\r\n        this.privList.forEach((val: TItem): void => {\r\n            cloneCopy.push(val);\r\n        });\r\n        return cloneCopy;\r\n    }\r\n\r\n    public any(callback?: (item: TItem, index: number) => boolean): boolean {\r\n        this.throwIfDisposed();\r\n        if (callback) {\r\n            return this.where(callback).length() > 0;\r\n        } else {\r\n            return this.length() > 0;\r\n        }\r\n    }\r\n\r\n    public all(callback: (item: TItem) => boolean): boolean {\r\n        this.throwIfDisposed();\r\n        return this.where(callback).length() === this.length();\r\n    }\r\n\r\n    public forEach(callback: (item: TItem, index: number) => void): void {\r\n        this.throwIfDisposed();\r\n        for (let i = 0; i < this.length(); i++) {\r\n            callback(this.privList[i], i);\r\n        }\r\n    }\r\n\r\n    public select<T2>(callback: (item: TItem, index: number) => T2): List<T2> {\r\n        this.throwIfDisposed();\r\n        const selectList: T2[] = [];\r\n        for (let i = 0; i < this.privList.length; i++) {\r\n            selectList.push(callback(this.privList[i], i));\r\n        }\r\n\r\n        return new List<T2>(selectList);\r\n    }\r\n\r\n    public where(callback: (item: TItem, index: number) => boolean): List<TItem> {\r\n        this.throwIfDisposed();\r\n        const filteredList = new List<TItem>();\r\n        for (let i = 0; i < this.privList.length; i++) {\r\n            if (callback(this.privList[i], i)) {\r\n                filteredList.add(this.privList[i]);\r\n            }\r\n        }\r\n        return filteredList;\r\n    }\r\n\r\n    public orderBy(compareFn: (a: TItem, b: TItem) => number): List<TItem> {\r\n        this.throwIfDisposed();\r\n        const clonedArray = this.toArray();\r\n        const orderedArray = clonedArray.sort(compareFn);\r\n        return new List(orderedArray);\r\n    }\r\n\r\n    public orderByDesc(compareFn: (a: TItem, b: TItem) => number): List<TItem> {\r\n        this.throwIfDisposed();\r\n        return this.orderBy((a: TItem, b: TItem): number => compareFn(b, a));\r\n    }\r\n\r\n    public clone(): List<TItem> {\r\n        this.throwIfDisposed();\r\n        return new List<TItem>(this.toArray());\r\n    }\r\n\r\n    public concat(list: List<TItem>): List<TItem> {\r\n        this.throwIfDisposed();\r\n        return new List<TItem>(this.privList.concat(list.toArray()));\r\n    }\r\n\r\n    public concatArray(array: TItem[]): List<TItem> {\r\n        this.throwIfDisposed();\r\n        return new List<TItem>(this.privList.concat(array));\r\n    }\r\n\r\n    public isDisposed(): boolean {\r\n        return this.privList == null;\r\n    }\r\n\r\n    public dispose(reason?: string): void {\r\n        if (!this.isDisposed()) {\r\n            this.privDisposeReason = reason;\r\n            this.privList = null;\r\n            this.privAddSubscriptions = null;\r\n            this.privRemoveSubscriptions = null;\r\n            this.triggerSubscriptions(this.privDisposedSubscriptions);\r\n        }\r\n    }\r\n\r\n    private throwIfDisposed(): void {\r\n        if (this.isDisposed()) {\r\n            throw new ObjectDisposedError(\"List\", this.privDisposeReason);\r\n        }\r\n    }\r\n\r\n    private triggerSubscriptions(subscriptions: IStringDictionary<() => void>): void {\r\n        if (subscriptions) {\r\n            for (const subscriptionId in subscriptions) {\r\n                if (subscriptionId) {\r\n                    subscriptions[subscriptionId]();\r\n                }\r\n            }\r\n        }\r\n    }\r\n}\r\n"]}