{"version":3,"sources":["src/common/List.ts"],"names":[],"mappings":"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","file":"List.d.ts","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved.\n// Licensed under the MIT license.\n\nimport { ObjectDisposedError } from \"./Error\";\nimport { IDetachable } from \"./IDetachable\";\nimport { IStringDictionary } from \"./IDictionary\";\nimport { IDisposable } from \"./IDisposable\";\n\nexport interface IList<TItem> extends IDisposable {\n    get(itemIndex: number): TItem;\n    first(): TItem;\n    last(): TItem;\n\n    add(item: TItem): void;\n    insertAt(index: number, item: TItem): void;\n\n    removeFirst(): TItem;\n    removeLast(): TItem;\n    removeAt(index: number): TItem;\n    remove(index: number, count: number): TItem[];\n    clear(): void;\n\n    length(): number;\n\n    onAdded(addedCallback: () => void): IDetachable;\n    onRemoved(removedCallback: () => void): IDetachable;\n    onDisposed(disposedCallback: () => void): IDetachable;\n\n    join(seperator?: string): string;\n\n    toArray(): TItem[];\n\n    any(callback?: (item: TItem, index: number) => boolean): boolean;\n    all(callback: (item: TItem) => boolean): boolean;\n    forEach(callback: (item: TItem, index: number) => void): void;\n    select<T2>(callback: (item: TItem, index: number) => T2): List<T2>;\n    where(callback: (item: TItem, index: number) => boolean): List<TItem>;\n    orderBy(compareFn: (a: TItem, b: TItem) => number): List<TItem>;\n    orderByDesc(compareFn: (a: TItem, b: TItem) => number): List<TItem>;\n    clone(): List<TItem>;\n    concat(list: List<TItem>): List<TItem>;\n    concatArray(array: TItem[]): List<TItem>;\n}\n\nexport class List<TItem> implements IList<TItem>  {\n    private privList: TItem[];\n    private privSubscriptionIdCounter: number = 0;\n    private privAddSubscriptions: IStringDictionary<() => void> = {};\n    private privRemoveSubscriptions: IStringDictionary<() => void> = {};\n    private privDisposedSubscriptions: IStringDictionary<() => void> = {};\n    private privDisposeReason: string = null;\n\n    public constructor(list?: TItem[]) {\n        this.privList = [];\n        // copy the list rather than taking as is.\n        if (list) {\n            for (const item of list) {\n                this.privList.push(item);\n            }\n        }\n    }\n\n    public get = (itemIndex: number): TItem => {\n        this.throwIfDisposed();\n        return this.privList[itemIndex];\n    }\n\n    public first = (): TItem => {\n        return this.get(0);\n    }\n\n    public last = (): TItem => {\n        return this.get(this.length() - 1);\n    }\n\n    public add = (item: TItem): void => {\n        this.throwIfDisposed();\n        this.insertAt(this.privList.length, item);\n    }\n\n    public insertAt = (index: number, item: TItem): void => {\n        this.throwIfDisposed();\n        if (index === 0) {\n            this.privList.unshift(item);\n        } else if (index === this.privList.length) {\n            this.privList.push(item);\n        } else {\n            this.privList.splice(index, 0, item);\n        }\n        this.triggerSubscriptions(this.privAddSubscriptions);\n    }\n\n    public removeFirst = (): TItem => {\n        this.throwIfDisposed();\n        return this.removeAt(0);\n    }\n\n    public removeLast = (): TItem => {\n        this.throwIfDisposed();\n        return this.removeAt(this.length() - 1);\n    }\n\n    public removeAt = (index: number): TItem => {\n        this.throwIfDisposed();\n        return this.remove(index, 1)[0];\n    }\n\n    public remove = (index: number, count: number): TItem[] => {\n        this.throwIfDisposed();\n        const removedElements = this.privList.splice(index, count);\n        this.triggerSubscriptions(this.privRemoveSubscriptions);\n        return removedElements;\n    }\n\n    public clear = (): void => {\n        this.throwIfDisposed();\n        this.remove(0, this.length());\n    }\n\n    public length = (): number => {\n        this.throwIfDisposed();\n        return this.privList.length;\n    }\n\n    public onAdded = (addedCallback: () => void): IDetachable => {\n        this.throwIfDisposed();\n        const subscriptionId = this.privSubscriptionIdCounter++;\n\n        this.privAddSubscriptions[subscriptionId] = addedCallback;\n\n        return {\n            detach: () => {\n                delete this.privAddSubscriptions[subscriptionId];\n            },\n        };\n    }\n\n    public onRemoved = (removedCallback: () => void): IDetachable => {\n        this.throwIfDisposed();\n        const subscriptionId = this.privSubscriptionIdCounter++;\n\n        this.privRemoveSubscriptions[subscriptionId] = removedCallback;\n\n        return {\n            detach: () => {\n                delete this.privRemoveSubscriptions[subscriptionId];\n            },\n        };\n    }\n\n    public onDisposed = (disposedCallback: () => void): IDetachable => {\n        this.throwIfDisposed();\n        const subscriptionId = this.privSubscriptionIdCounter++;\n\n        this.privDisposedSubscriptions[subscriptionId] = disposedCallback;\n\n        return {\n            detach: () => {\n                delete this.privDisposedSubscriptions[subscriptionId];\n            },\n        };\n    }\n\n    public join = (seperator?: string): string => {\n        this.throwIfDisposed();\n        return this.privList.join(seperator);\n    }\n\n    public toArray = (): TItem[] => {\n        const cloneCopy = Array<TItem>();\n        this.privList.forEach((val: TItem) => {\n            cloneCopy.push(val);\n        });\n        return cloneCopy;\n    }\n\n    public any = (callback?: (item: TItem, index: number) => boolean): boolean => {\n        this.throwIfDisposed();\n        if (callback) {\n            return this.where(callback).length() > 0;\n        } else {\n            return this.length() > 0;\n        }\n    }\n\n    public all = (callback: (item: TItem) => boolean): boolean => {\n        this.throwIfDisposed();\n        return this.where(callback).length() === this.length();\n    }\n\n    public forEach = (callback: (item: TItem, index: number) => void): void => {\n        this.throwIfDisposed();\n        for (let i = 0; i < this.length(); i++) {\n            callback(this.privList[i], i);\n        }\n    }\n\n    public select = <T2>(callback: (item: TItem, index: number) => T2): List<T2> => {\n        this.throwIfDisposed();\n        const selectList: T2[] = [];\n        for (let i = 0; i < this.privList.length; i++) {\n            selectList.push(callback(this.privList[i], i));\n        }\n\n        return new List<T2>(selectList);\n    }\n\n    public where = (callback: (item: TItem, index: number) => boolean): List<TItem> => {\n        this.throwIfDisposed();\n        const filteredList = new List<TItem>();\n        for (let i = 0; i < this.privList.length; i++) {\n            if (callback(this.privList[i], i)) {\n                filteredList.add(this.privList[i]);\n            }\n        }\n        return filteredList;\n    }\n\n    public orderBy = (compareFn: (a: TItem, b: TItem) => number): List<TItem> => {\n        this.throwIfDisposed();\n        const clonedArray = this.toArray();\n        const orderedArray = clonedArray.sort(compareFn);\n        return new List(orderedArray);\n    }\n\n    public orderByDesc = (compareFn: (a: TItem, b: TItem) => number): List<TItem> => {\n        this.throwIfDisposed();\n        return this.orderBy((a: TItem, b: TItem) => compareFn(b, a));\n    }\n\n    public clone = (): List<TItem> => {\n        this.throwIfDisposed();\n        return new List<TItem>(this.toArray());\n    }\n\n    public concat = (list: List<TItem>): List<TItem> => {\n        this.throwIfDisposed();\n        return new List<TItem>(this.privList.concat(list.toArray()));\n    }\n\n    public concatArray = (array: TItem[]): List<TItem> => {\n        this.throwIfDisposed();\n        return new List<TItem>(this.privList.concat(array));\n    }\n\n    public isDisposed = (): boolean => {\n        return this.privList == null;\n    }\n\n    public dispose = (reason?: string): void => {\n        if (!this.isDisposed()) {\n            this.privDisposeReason = reason;\n            this.privList = null;\n            this.privAddSubscriptions = null;\n            this.privRemoveSubscriptions = null;\n            this.triggerSubscriptions(this.privDisposedSubscriptions);\n        }\n    }\n\n    private throwIfDisposed = (): void => {\n        if (this.isDisposed()) {\n            throw new ObjectDisposedError(\"List\", this.privDisposeReason);\n        }\n    }\n\n    private triggerSubscriptions = (subscriptions: IStringDictionary<() => void>): void => {\n        if (subscriptions) {\n            for (const subscriptionId in subscriptions) {\n                if (subscriptionId) {\n                    subscriptions[subscriptionId]();\n                }\n            }\n        }\n    }\n}\n"]}