From 382cb34538894512753de7cdf772426d5cc3766c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 6 Apr 2020 15:20:05 +0200 Subject: [PATCH 1/3] adopt native iterators in trees --- src/vs/base/browser/ui/tree/asyncDataTree.ts | 4 +- .../ui/tree/compressedObjectTreeModel.ts | 39 +++--- src/vs/base/browser/ui/tree/dataTree.ts | 6 +- src/vs/base/browser/ui/tree/indexTree.ts | 4 +- src/vs/base/browser/ui/tree/indexTreeModel.ts | 18 +-- src/vs/base/browser/ui/tree/objectTree.ts | 6 +- .../base/browser/ui/tree/objectTreeModel.ts | 24 ++-- src/vs/base/browser/ui/tree/tree.ts | 3 +- src/vs/base/common/iterator.ts | 38 ++++++ src/vs/base/common/resourceTree.ts | 11 +- .../ui/tree/compressedObjectTreeModel.test.ts | 62 ++++----- .../browser/ui/tree/indexTreeModel.test.ts | 121 +++++++++--------- .../test/browser/ui/tree/objectTree.test.ts | 81 ++++++------ .../browser/ui/tree/objectTreeModel.test.ts | 35 +++-- .../contrib/markers/browser/markersView.ts | 15 +-- .../preferences/browser/settingsEditor2.ts | 8 +- .../contrib/preferences/browser/tocTree.ts | 7 +- .../contrib/scm/browser/repositoryPane.ts | 8 +- .../contrib/search/browser/searchView.ts | 25 ++-- 19 files changed, 268 insertions(+), 247 deletions(-) diff --git a/src/vs/base/browser/ui/tree/asyncDataTree.ts b/src/vs/base/browser/ui/tree/asyncDataTree.ts index 35a093fd214..39470b6e11b 100644 --- a/src/vs/base/browser/ui/tree/asyncDataTree.ts +++ b/src/vs/base/browser/ui/tree/asyncDataTree.ts @@ -11,7 +11,7 @@ import { IDisposable, dispose, DisposableStore } from 'vs/base/common/lifecycle' import { Emitter, Event } from 'vs/base/common/event'; import { timeout, CancelablePromise, createCancelablePromise } from 'vs/base/common/async'; import { IListStyles } from 'vs/base/browser/ui/list/listWidget'; -import { Iterator } from 'vs/base/common/iterator'; +import { Iterable } from 'vs/base/common/iterator'; import { IDragAndDropData } from 'vs/base/browser/dnd'; import { ElementsDragAndDropData } from 'vs/base/browser/ui/list/listView'; import { isPromiseCanceledError, onUnexpectedError } from 'vs/base/common/errors'; @@ -943,7 +943,7 @@ export class AsyncDataTree implements IDisposable return { element: node, - children: node.hasChildren ? Iterator.map(Iterator.fromArray(node.children), child => this.asTreeElement(child, viewStateContext)) : [], + children: node.hasChildren ? Iterable.map(node.children, child => this.asTreeElement(child, viewStateContext)) : [], collapsible: node.hasChildren, collapsed }; diff --git a/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts b/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts index 8c0cffe6983..d3a0f95131b 100644 --- a/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts +++ b/src/vs/base/browser/ui/tree/compressedObjectTreeModel.ts @@ -4,14 +4,14 @@ *--------------------------------------------------------------------------------------------*/ import { ISpliceable } from 'vs/base/common/sequence'; -import { Iterator, ISequence } from 'vs/base/common/iterator'; +import { Iterable } from 'vs/base/common/iterator'; import { Event } from 'vs/base/common/event'; import { ITreeModel, ITreeNode, ITreeElement, ICollapseStateChangeEvent, ITreeModelSpliceEvent, TreeError, TreeFilterResult, TreeVisibility, WeakMapper } from 'vs/base/browser/ui/tree/tree'; import { IObjectTreeModelOptions, ObjectTreeModel, IObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel'; // Exported only for test reasons, do not use directly export interface ICompressedTreeElement extends ITreeElement { - readonly children?: ISequence>; + readonly children?: Iterable>; readonly incompressible?: boolean; } @@ -27,7 +27,7 @@ function noCompress(element: ICompressedTreeElement): ITreeElement(element: ICompressedTreeElement): ITreeElement>; + let childrenIterator: Iterable>; let children: ITreeElement[]; while (true) { - childrenIterator = Iterator.from(element.children); - children = Iterator.collect(childrenIterator, 2); + [children, childrenIterator] = Iterable.consume(Iterable.from(element.children), 2); if (children.length !== 1) { break; @@ -60,19 +59,19 @@ export function compress(element: ICompressedTreeElement): ITreeElement(element: ITreeElement>, index = 0): ICompressedTreeElement { - let children: Iterator>; + let children: Iterable>; if (index < element.element.elements.length - 1) { - children = Iterator.single(_decompress(element, index + 1)); + children = [_decompress(element, index + 1)]; } else { - children = Iterator.map(Iterator.from(element.children), el => _decompress(el, 0)); + children = Iterable.map(Iterable.from(element.children), el => _decompress(el, 0)); } if (index === 0 && element.element.incompressible) { @@ -98,12 +97,12 @@ export function decompress(element: ITreeElement>): IC return _decompress(element, 0); } -function splice(treeElement: ICompressedTreeElement, element: T, children: Iterator>): ICompressedTreeElement { +function splice(treeElement: ICompressedTreeElement, element: T, children: Iterable>): ICompressedTreeElement { if (treeElement.element === element) { return { ...treeElement, children }; } - return { ...treeElement, children: Iterator.map(Iterator.from(treeElement.children), e => splice(e, element, children)) }; + return { ...treeElement, children: Iterable.map(Iterable.from(treeElement.children), e => splice(e, element, children)) }; } interface ICompressedObjectTreeModelOptions extends IObjectTreeModelOptions, TFilterData> { @@ -136,10 +135,10 @@ export class CompressedObjectTreeModel, TFilterData e setChildren( element: T | null, - children: ISequence> | undefined + children: Iterable> = Iterable.empty() ): void { if (element === null) { - const compressedChildren = Iterator.map(Iterator.from(children), this.enabled ? compress : noCompress); + const compressedChildren = Iterable.map(children, this.enabled ? compress : noCompress); this._setChildren(null, compressedChildren); return; } @@ -155,7 +154,7 @@ export class CompressedObjectTreeModel, TFilterData e const parent = this.model.getNode(compressedParentNode) as ITreeNode, TFilterData>; const decompressedElement = decompress(node); - const splicedElement = splice(decompressedElement, element, Iterator.from(children)); + const splicedElement = splice(decompressedElement, element, children); const recompressedElement = (this.enabled ? compress : noCompress)(splicedElement); const parentChildren = parent.children @@ -176,15 +175,15 @@ export class CompressedObjectTreeModel, TFilterData e this.enabled = enabled; const root = this.model.getNode(); - const rootChildren = Iterator.from(root.children as ITreeNode>[]); - const decompressedRootChildren = Iterator.map(rootChildren, decompress); - const recompressedRootChildren = Iterator.map(decompressedRootChildren, enabled ? compress : noCompress); + const rootChildren = root.children as ITreeNode>[]; + const decompressedRootChildren = Iterable.map(rootChildren, decompress); + const recompressedRootChildren = Iterable.map(decompressedRootChildren, enabled ? compress : noCompress); this._setChildren(null, recompressedRootChildren); } private _setChildren( node: ICompressedTreeNode | null, - children: ISequence>> | undefined + children: Iterable>> ): void { const insertedElements = new Set(); const _onDidCreateNode = (node: ITreeNode, TFilterData>) => { @@ -413,7 +412,7 @@ export class CompressibleObjectTreeModel, TFilterData this.model = new CompressedObjectTreeModel(user, mapList(this.nodeMapper, list), mapOptions(compressedNodeUnwrapper, options)); } - setChildren(element: T | null, children?: ISequence>): void { + setChildren(element: T | null, children: Iterable> = Iterable.empty()): void { this.model.setChildren(element, children); } diff --git a/src/vs/base/browser/ui/tree/dataTree.ts b/src/vs/base/browser/ui/tree/dataTree.ts index f14d44e8e4a..34b03c65c26 100644 --- a/src/vs/base/browser/ui/tree/dataTree.ts +++ b/src/vs/base/browser/ui/tree/dataTree.ts @@ -8,7 +8,7 @@ import { ISpliceable } from 'vs/base/common/sequence'; import { ITreeNode, ITreeModel, ITreeElement, ITreeRenderer, ITreeSorter, IDataSource, TreeError } from 'vs/base/browser/ui/tree/tree'; import { ObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel'; import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list'; -import { Iterator } from 'vs/base/common/iterator'; +import { Iterable } from 'vs/base/common/iterator'; export interface IDataTreeOptions extends IAbstractTreeOptions { readonly sorter?: ITreeSorter; @@ -158,9 +158,9 @@ export class DataTree extends AbstractTree boolean | undefined): { elements: Iterator>, size: number } { + private iterate(element: TInput | T, isCollapsed?: (el: T) => boolean | undefined): { elements: Iterable>, size: number } { const children = this.dataSource.getChildren(element); - const elements = Iterator.map>(Iterator.fromArray(children), element => { + const elements = Iterable.map(children, element => { const { elements: children, size } = this.iterate(element, isCollapsed); const collapsible = this.dataSource.hasChildren ? this.dataSource.hasChildren(element) : undefined; const collapsed = size === 0 ? undefined : (isCollapsed && isCollapsed(element)); diff --git a/src/vs/base/browser/ui/tree/indexTree.ts b/src/vs/base/browser/ui/tree/indexTree.ts index 7cf73ee5fd7..d4be627730e 100644 --- a/src/vs/base/browser/ui/tree/indexTree.ts +++ b/src/vs/base/browser/ui/tree/indexTree.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import 'vs/css!./media/tree'; -import { Iterator, ISequence } from 'vs/base/common/iterator'; +import { Iterable } from 'vs/base/common/iterator'; import { AbstractTree, IAbstractTreeOptions } from 'vs/base/browser/ui/tree/abstractTree'; import { ISpliceable } from 'vs/base/common/sequence'; import { IndexTreeModel } from 'vs/base/browser/ui/tree/indexTreeModel'; @@ -28,7 +28,7 @@ export class IndexTree extends AbstractTree> = Iterator.empty()): void { + splice(location: number[], deleteCount: number, toInsert: Iterable> = Iterable.empty()): void { this.model.splice(location, deleteCount, toInsert); } diff --git a/src/vs/base/browser/ui/tree/indexTreeModel.ts b/src/vs/base/browser/ui/tree/indexTreeModel.ts index b0c1ed8628f..17b860852eb 100644 --- a/src/vs/base/browser/ui/tree/indexTreeModel.ts +++ b/src/vs/base/browser/ui/tree/indexTreeModel.ts @@ -6,7 +6,7 @@ import { ICollapseStateChangeEvent, ITreeElement, ITreeFilter, ITreeFilterDataResult, ITreeModel, ITreeNode, TreeVisibility, ITreeModelSpliceEvent, TreeError } from 'vs/base/browser/ui/tree/tree'; import { tail2 } from 'vs/base/common/arrays'; import { Emitter, Event, EventBufferer } from 'vs/base/common/event'; -import { ISequence, Iterator } from 'vs/base/common/iterator'; +import { Iterable } from 'vs/base/common/iterator'; import { ISpliceable } from 'vs/base/common/sequence'; // Exported for tests @@ -103,7 +103,7 @@ export class IndexTreeModel, TFilterData = voi splice( location: number[], deleteCount: number, - toInsert?: ISequence>, + toInsert: Iterable> = Iterable.empty(), onDidCreateNode?: (node: ITreeNode) => void, onDidDeleteNode?: (node: ITreeNode) => void ): void { @@ -113,7 +113,7 @@ export class IndexTreeModel, TFilterData = voi const { parentNode, listIndex, revealed, visible } = this.getParentNodeWithListIndex(location); const treeListElementsToInsert: ITreeNode[] = []; - const nodesToInsertIterator = Iterator.map(Iterator.from(toInsert), el => this.createTreeNode(el, parentNode, parentNode.visible ? TreeVisibility.Visible : TreeVisibility.Hidden, revealed, treeListElementsToInsert, onDidCreateNode)); + const nodesToInsertIterator = Iterable.map(toInsert, el => this.createTreeNode(el, parentNode, parentNode.visible ? TreeVisibility.Visible : TreeVisibility.Hidden, revealed, treeListElementsToInsert, onDidCreateNode)); const lastIndex = location[location.length - 1]; @@ -134,14 +134,14 @@ export class IndexTreeModel, TFilterData = voi let insertedVisibleChildrenCount = 0; let renderNodeCount = 0; - Iterator.forEach(nodesToInsertIterator, child => { + for (const child of nodesToInsertIterator) { nodesToInsert.push(child); renderNodeCount += child.renderNodeCount; if (child.visible) { child.visibleChildIndex = visibleChildStartIndex + insertedVisibleChildrenCount++; } - }); + } const deletedNodes = parentNode.children.splice(lastIndex, deleteCount, ...nodesToInsert); @@ -365,21 +365,21 @@ export class IndexTreeModel, TFilterData = voi treeListElements.push(node); } - const childElements = Iterator.from(treeElement.children); + const childElements = treeElement.children || Iterable.empty(); const childRevealed = revealed && visibility !== TreeVisibility.Hidden && !node.collapsed; - const childNodes = Iterator.map(childElements, el => this.createTreeNode(el, node, visibility, childRevealed, treeListElements, onDidCreateNode)); + const childNodes = Iterable.map(childElements, el => this.createTreeNode(el, node, visibility, childRevealed, treeListElements, onDidCreateNode)); let visibleChildrenCount = 0; let renderNodeCount = 1; - Iterator.forEach(childNodes, child => { + for (const child of childNodes) { node.children.push(child); renderNodeCount += child.renderNodeCount; if (child.visible) { child.visibleChildIndex = visibleChildrenCount++; } - }); + } node.collapsible = node.collapsible || node.children.length > 0; node.visibleChildrenCount = visibleChildrenCount; diff --git a/src/vs/base/browser/ui/tree/objectTree.ts b/src/vs/base/browser/ui/tree/objectTree.ts index a259ad59db0..38647079853 100644 --- a/src/vs/base/browser/ui/tree/objectTree.ts +++ b/src/vs/base/browser/ui/tree/objectTree.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { ISequence } from 'vs/base/common/iterator'; +import { Iterable } from 'vs/base/common/iterator'; import { AbstractTree, IAbstractTreeOptions, IAbstractTreeOptionsUpdate } from 'vs/base/browser/ui/tree/abstractTree'; import { ISpliceable } from 'vs/base/common/sequence'; import { ITreeNode, ITreeModel, ITreeElement, ITreeRenderer, ITreeSorter, ICollapseStateChangeEvent } from 'vs/base/browser/ui/tree/tree'; @@ -33,7 +33,7 @@ export class ObjectTree, TFilterData = void> extends super(user, container, delegate, renderers, options as IObjectTreeOptions); } - setChildren(element: T | null, children?: ISequence>): void { + setChildren(element: T | null, children: Iterable> = Iterable.empty()): void { this.model.setChildren(element, children); } @@ -184,7 +184,7 @@ export class CompressibleObjectTree, TFilterData = vo super(user, container, delegate, compressibleRenderers, asObjectTreeOptions(compressedTreeNodeProvider, options)); } - setChildren(element: T | null, children?: ISequence>): void { + setChildren(element: T | null, children: Iterable> = Iterable.empty()): void { this.model.setChildren(element, children); } diff --git a/src/vs/base/browser/ui/tree/objectTreeModel.ts b/src/vs/base/browser/ui/tree/objectTreeModel.ts index 1031060c15f..12c839ab10c 100644 --- a/src/vs/base/browser/ui/tree/objectTreeModel.ts +++ b/src/vs/base/browser/ui/tree/objectTreeModel.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { ISpliceable } from 'vs/base/common/sequence'; -import { Iterator, ISequence, getSequenceIterator } from 'vs/base/common/iterator'; +import { Iterable } from 'vs/base/common/iterator'; import { IndexTreeModel, IIndexTreeModelOptions } from 'vs/base/browser/ui/tree/indexTreeModel'; import { Event } from 'vs/base/common/event'; import { ITreeModel, ITreeNode, ITreeElement, ITreeSorter, ICollapseStateChangeEvent, ITreeModelSpliceEvent, TreeError } from 'vs/base/browser/ui/tree/tree'; @@ -14,7 +14,7 @@ import { mergeSort } from 'vs/base/common/arrays'; export type ITreeNodeCallback = (node: ITreeNode) => void; export interface IObjectTreeModel, TFilterData extends NonNullable = void> extends ITreeModel { - setChildren(element: T | null, children: ISequence> | undefined): void; + setChildren(element: T | null, children: Iterable> | undefined): void; resort(element?: T | null, recursive?: boolean): void; } @@ -62,7 +62,7 @@ export class ObjectTreeModel, TFilterData extends Non setChildren( element: T | null, - children: ISequence> | undefined, + children: Iterable> = Iterable.empty(), onDidCreateNode?: ITreeNodeCallback, onDidDeleteNode?: ITreeNodeCallback ): void { @@ -72,7 +72,7 @@ export class ObjectTreeModel, TFilterData extends Non private _setChildren( location: number[], - children: ISequence> | undefined, + children: Iterable> = Iterable.empty(), onDidCreateNode?: ITreeNodeCallback, onDidDeleteNode?: ITreeNodeCallback ): void { @@ -132,14 +132,12 @@ export class ObjectTreeModel, TFilterData extends Non ); } - private preserveCollapseState(elements: ISequence> | undefined): ISequence> { - let iterator = elements ? getSequenceIterator(elements) : Iterator.empty>(); - + private preserveCollapseState(elements: Iterable> = Iterable.empty()): Iterable> { if (this.sorter) { - iterator = Iterator.fromArray(mergeSort(Iterator.collect(iterator), this.sorter.compare.bind(this.sorter))); + elements = mergeSort([...elements], this.sorter.compare.bind(this.sorter)); } - return Iterator.map(iterator, treeElement => { + return Iterable.map(elements, treeElement => { let node = this.nodes.get(treeElement.element); if (!node && this.identityProvider) { @@ -182,14 +180,14 @@ export class ObjectTreeModel, TFilterData extends Non this._setChildren(location, this.resortChildren(node, recursive)); } - private resortChildren(node: ITreeNode, recursive: boolean, first = true): ISequence> { - let childrenNodes = Iterator.fromArray(node.children as ITreeNode[]); + private resortChildren(node: ITreeNode, recursive: boolean, first = true): Iterable> { + let childrenNodes = [...node.children] as ITreeNode[]; if (recursive || first) { - childrenNodes = Iterator.fromArray(Iterator.collect(childrenNodes).sort(this.sorter!.compare.bind(this.sorter))); + childrenNodes = mergeSort(childrenNodes, this.sorter!.compare.bind(this.sorter)); } - return Iterator.map, ITreeElement>(childrenNodes, node => ({ + return Iterable.map, ITreeElement>(childrenNodes, node => ({ element: node.element as T, collapsible: node.collapsible, collapsed: node.collapsed, diff --git a/src/vs/base/browser/ui/tree/tree.ts b/src/vs/base/browser/ui/tree/tree.ts index 7e2b282cf82..ca65afa52a8 100644 --- a/src/vs/base/browser/ui/tree/tree.ts +++ b/src/vs/base/browser/ui/tree/tree.ts @@ -4,7 +4,6 @@ *--------------------------------------------------------------------------------------------*/ import { Event } from 'vs/base/common/event'; -import { Iterator } from 'vs/base/common/iterator'; import { IListRenderer, IListDragOverReaction, IListDragAndDrop, ListDragOverEffect } from 'vs/base/browser/ui/list/list'; import { IDragAndDropData } from 'vs/base/browser/dnd'; @@ -74,7 +73,7 @@ export interface ITreeSorter { export interface ITreeElement { readonly element: T; - readonly children?: Iterator> | ITreeElement[]; + readonly children?: Iterable>; readonly collapsible?: boolean; readonly collapsed?: boolean; } diff --git a/src/vs/base/common/iterator.ts b/src/vs/base/common/iterator.ts index 75466584415..cf2cd832dd3 100644 --- a/src/vs/base/common/iterator.ts +++ b/src/vs/base/common/iterator.ts @@ -41,6 +41,10 @@ export namespace Iterable { return _empty; } + export function from(iterable: Iterable | undefined | null): Iterable { + return iterable || _empty; + } + export function first(iterable: Iterable): T | undefined { return iterable[Symbol.iterator]().next().value; } @@ -67,6 +71,40 @@ export namespace Iterable { yield fn(element); } } + + export function* concat(...iterables: Iterable[]): Iterable { + for (const iterable of iterables) { + for (const element of iterable) { + yield element; + } + } + } + + /** + * Consumes `atMost` elements from iterable and returns the consumed elements, + * and an iterable for the rest of the elements. + */ + export function consume(iterable: Iterable, atMost: number = Number.POSITIVE_INFINITY): [T[], Iterable] { + const consumed: T[] = []; + + if (atMost === 0) { + return [consumed, iterable]; + } + + const iterator = iterable[Symbol.iterator](); + + for (let i = 0; i < atMost; i++) { + const next = iterator.next(); + + if (next.done) { + return [consumed, Iterable.empty()]; + } + + consumed.push(next.value); + } + + return [consumed, { [Symbol.iterator]() { return iterator; } }]; + } } export module Iterator { diff --git a/src/vs/base/common/resourceTree.ts b/src/vs/base/common/resourceTree.ts index 2de60729275..ef537317389 100644 --- a/src/vs/base/common/resourceTree.ts +++ b/src/vs/base/common/resourceTree.ts @@ -5,7 +5,6 @@ import { memoize } from 'vs/base/common/decorators'; import * as paths from 'vs/base/common/path'; -import { Iterator } from 'vs/base/common/iterator'; import { relativePath, joinPath } from 'vs/base/common/resources'; import { URI } from 'vs/base/common/uri'; import { PathIterator, values } from 'vs/base/common/map'; @@ -15,7 +14,7 @@ export interface IResourceNode { readonly relativePath: string; readonly name: string; readonly element: T | undefined; - readonly children: Iterator>; + readonly children: Iterable>; readonly childrenCount: number; readonly parent: IResourceNode | undefined; readonly context: C; @@ -30,8 +29,8 @@ class Node implements IResourceNode { return this._children.size; } - get children(): Iterator> { - return Iterator.fromArray(values(this._children)); + get children(): Iterable> { + return [...values(this._children)]; } @memoize @@ -69,7 +68,9 @@ function collect(node: IResourceNode, result: T[]): T[] { result.push(node.element); } - Iterator.forEach(node.children, child => collect(child, result)); + for (const child of node.children) { + collect(child, result); + } return result; } diff --git a/src/vs/base/test/browser/ui/tree/compressedObjectTreeModel.test.ts b/src/vs/base/test/browser/ui/tree/compressedObjectTreeModel.test.ts index b69e61abcb8..d13b997ea75 100644 --- a/src/vs/base/test/browser/ui/tree/compressedObjectTreeModel.test.ts +++ b/src/vs/base/test/browser/ui/tree/compressedObjectTreeModel.test.ts @@ -5,7 +5,7 @@ import * as assert from 'assert'; import { compress, ICompressedTreeElement, ICompressedTreeNode, decompress, CompressedObjectTreeModel } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; -import { Iterator } from 'vs/base/common/iterator'; +import { Iterable } from 'vs/base/common/iterator'; import { ITreeNode } from 'vs/base/browser/ui/tree/tree'; import { ISpliceable } from 'vs/base/common/sequence'; @@ -16,7 +16,7 @@ interface IResolvedCompressedTreeElement extends ICompressedTreeElement { function resolve(treeElement: ICompressedTreeElement): IResolvedCompressedTreeElement { const result: any = { element: treeElement.element }; - const children = Iterator.collect(Iterator.map(Iterator.from(treeElement.children), resolve)); + const children = [...Iterable.map(Iterable.from(treeElement.children), resolve)]; if (treeElement.incompressible) { result.incompressible = true; @@ -315,25 +315,25 @@ suite('CompressedObjectTree', function () { const list: ITreeNode>[] = []; const model = new CompressedObjectTreeModel('test', toSpliceable(list)); - model.setChildren(null, Iterator.fromArray([ + model.setChildren(null, [ { element: 0 }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(toArray(list), [[0], [1], [2]]); assert.equal(model.size, 3); - model.setChildren(null, Iterator.fromArray([ + model.setChildren(null, [ { element: 3 }, { element: 4 }, { element: 5 }, - ])); + ]); assert.deepEqual(toArray(list), [[3], [4], [5]]); assert.equal(model.size, 3); - model.setChildren(null, Iterator.empty()); + model.setChildren(null); assert.deepEqual(toArray(list), []); assert.equal(model.size, 0); }); @@ -342,34 +342,34 @@ suite('CompressedObjectTree', function () { const list: ITreeNode>[] = []; const model = new CompressedObjectTreeModel('test', toSpliceable(list)); - model.setChildren(null, Iterator.fromArray([ + model.setChildren(null, [ { - element: 0, children: Iterator.fromArray([ + element: 0, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(toArray(list), [[0], [10], [11], [12], [1], [2]]); assert.equal(model.size, 6); - model.setChildren(12, Iterator.fromArray([ + model.setChildren(12, [ { element: 120 }, { element: 121 } - ])); + ]); assert.deepEqual(toArray(list), [[0], [10], [11], [12], [120], [121], [1], [2]]); assert.equal(model.size, 8); - model.setChildren(0, Iterator.empty()); + model.setChildren(0); assert.deepEqual(toArray(list), [[0], [1], [2]]); assert.equal(model.size, 3); - model.setChildren(null, Iterator.empty()); + model.setChildren(null); assert.deepEqual(toArray(list), []); assert.equal(model.size, 0); }); @@ -378,50 +378,50 @@ suite('CompressedObjectTree', function () { const list: ITreeNode>[] = []; const model = new CompressedObjectTreeModel('test', toSpliceable(list)); - model.setChildren(null, Iterator.fromArray([ + model.setChildren(null, [ { - element: 1, children: Iterator.fromArray([{ - element: 11, children: Iterator.fromArray([{ - element: 111, children: Iterator.fromArray([ + element: 1, children: [{ + element: 11, children: [{ + element: 111, children: [ { element: 1111 }, { element: 1112 }, { element: 1113 }, - ]) - }]) - }]) + ] + }] + }] } - ])); + ]); assert.deepEqual(toArray(list), [[1, 11, 111], [1111], [1112], [1113]]); assert.equal(model.size, 6); - model.setChildren(11, Iterator.fromArray([ + model.setChildren(11, [ { element: 111 }, { element: 112 }, { element: 113 }, - ])); + ]); assert.deepEqual(toArray(list), [[1, 11], [111], [112], [113]]); assert.equal(model.size, 5); - model.setChildren(113, Iterator.fromArray([ + model.setChildren(113, [ { element: 1131 } - ])); + ]); assert.deepEqual(toArray(list), [[1, 11], [111], [112], [113, 1131]]); assert.equal(model.size, 6); - model.setChildren(1131, Iterator.fromArray([ + model.setChildren(1131, [ { element: 1132 } - ])); + ]); assert.deepEqual(toArray(list), [[1, 11], [111], [112], [113, 1131, 1132]]); assert.equal(model.size, 7); - model.setChildren(1131, Iterator.fromArray([ + model.setChildren(1131, [ { element: 1132 }, { element: 1133 }, - ])); + ]); assert.deepEqual(toArray(list), [[1, 11], [111], [112], [113, 1131], [1132], [1133]]); assert.equal(model.size, 8); diff --git a/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts b/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts index 43b8849801c..a5f46d06f2f 100644 --- a/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts +++ b/src/vs/base/test/browser/ui/tree/indexTreeModel.test.ts @@ -6,7 +6,6 @@ import * as assert from 'assert'; import { ITreeNode, ITreeFilter, TreeVisibility } from 'vs/base/browser/ui/tree/tree'; import { ISpliceable } from 'vs/base/common/sequence'; -import { Iterator } from 'vs/base/common/iterator'; import { IndexTreeModel, IIndexTreeNode } from 'vs/base/browser/ui/tree/indexTreeModel'; function toSpliceable(arr: T[]): ISpliceable { @@ -34,11 +33,11 @@ suite('IndexTreeModel', function () { const list: ITreeNode[] = []; const model = new IndexTreeModel('test', toSpliceable(list), -1); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { element: 0 }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(list.length, 3); assert.deepEqual(list[0].element, 0); @@ -56,17 +55,17 @@ suite('IndexTreeModel', function () { const list: ITreeNode[] = []; const model = new IndexTreeModel('test', toSpliceable(list), -1); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { - element: 0, children: Iterator.fromArray([ + element: 0, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(list.length, 6); assert.deepEqual(list[0].element, 0); @@ -93,17 +92,17 @@ suite('IndexTreeModel', function () { const list: ITreeNode[] = []; const model = new IndexTreeModel('test', toSpliceable(list), -1); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { - element: 0, collapsed: true, children: Iterator.fromArray([ + element: 0, collapsed: true, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(list.length, 3); assert.deepEqual(list[0].element, 0); @@ -121,11 +120,11 @@ suite('IndexTreeModel', function () { const list: ITreeNode[] = []; const model = new IndexTreeModel('test', toSpliceable(list), -1); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { element: 0 }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(list.length, 3); @@ -146,17 +145,17 @@ suite('IndexTreeModel', function () { const list: ITreeNode[] = []; const model = new IndexTreeModel('test', toSpliceable(list), -1); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { - element: 0, children: Iterator.fromArray([ + element: 0, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(list.length, 6); @@ -180,17 +179,17 @@ suite('IndexTreeModel', function () { const list: ITreeNode[] = []; const model = new IndexTreeModel('test', toSpliceable(list), -1); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { - element: 0, children: Iterator.fromArray([ + element: 0, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(list.length, 6); @@ -208,17 +207,17 @@ suite('IndexTreeModel', function () { const list: ITreeNode[] = []; const model = new IndexTreeModel('test', toSpliceable(list), -1); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { - element: 0, collapsed: true, children: Iterator.fromArray([ + element: 0, collapsed: true, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(list.length, 3); @@ -233,17 +232,17 @@ suite('IndexTreeModel', function () { const list: ITreeNode[] = []; const model = new IndexTreeModel('test', toSpliceable(list), -1); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { - element: 0, children: Iterator.fromArray([ + element: 0, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(list.length, 6); @@ -264,17 +263,17 @@ suite('IndexTreeModel', function () { const list: ITreeNode[] = []; const model = new IndexTreeModel('test', toSpliceable(list), -1); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { - element: 0, collapsed: true, children: Iterator.fromArray([ + element: 0, collapsed: true, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(list.length, 3); @@ -304,7 +303,7 @@ suite('IndexTreeModel', function () { const list: ITreeNode[] = []; const model = new IndexTreeModel('test', toSpliceable(list), -1); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { element: 1, children: [ { @@ -319,7 +318,7 @@ suite('IndexTreeModel', function () { { element: 21 } ] } - ])); + ]); assert.deepEqual(list.length, 5); assert.deepEqual(toArray(list), [1, 11, 111, 2, 21]); @@ -337,13 +336,13 @@ suite('IndexTreeModel', function () { const list: ITreeNode[] = []; const model = new IndexTreeModel('test', toSpliceable(list), -1); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { - element: 0, children: Iterator.fromArray([ + element: 0, children: [ { element: 10 } - ]) + ] } - ])); + ]); assert.deepEqual(list.length, 2); @@ -406,7 +405,7 @@ suite('IndexTreeModel', function () { const model = new IndexTreeModel('test', toSpliceable(list), -1, { filter }); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { element: 0, children: [ { element: 1 }, @@ -418,7 +417,7 @@ suite('IndexTreeModel', function () { { element: 7 } ] } - ])); + ]); assert.deepEqual(list.length, 4); assert.deepEqual(toArray(list), [0, 2, 4, 6]); @@ -440,14 +439,14 @@ suite('IndexTreeModel', function () { const model = new IndexTreeModel('test', toSpliceable(list), -1, { filter }); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { element: 0, children: [ { element: 1 }, { element: 2 } ] } - ])); + ]); assert.deepEqual(toArray(list), []); }); @@ -463,7 +462,7 @@ suite('IndexTreeModel', function () { const model = new IndexTreeModel('test', toSpliceable(list), -1, { filter }); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { element: 0, children: [ { element: 1 }, @@ -475,7 +474,7 @@ suite('IndexTreeModel', function () { { element: 7 } ] }, - ])); + ]); assert.deepEqual(toArray(list), [0, 1, 2, 3, 4, 5, 6, 7]); @@ -502,7 +501,7 @@ suite('IndexTreeModel', function () { const model = new IndexTreeModel('test', toSpliceable(list), 'root', { filter }); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { element: 'vscode', children: [ { element: '.build' }, @@ -522,7 +521,7 @@ suite('IndexTreeModel', function () { } ] }, - ])); + ]); assert.deepEqual(list.length, 10); @@ -548,7 +547,7 @@ suite('IndexTreeModel', function () { const model = new IndexTreeModel('test', toSpliceable(list), 'root', { filter }); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { element: 'vscode', children: [ { element: '.build' }, @@ -568,7 +567,7 @@ suite('IndexTreeModel', function () { } ] }, - ])); + ]); assert.deepEqual(list.length, 10); @@ -594,7 +593,7 @@ suite('IndexTreeModel', function () { const model = new IndexTreeModel('test', toSpliceable(list), 'root', { filter }); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { element: 'vscode', collapsed: true, children: [ { element: '.build' }, @@ -614,7 +613,7 @@ suite('IndexTreeModel', function () { } ] }, - ])); + ]); assert.deepEqual(toArray(list), ['vscode']); @@ -642,17 +641,17 @@ suite('IndexTreeModel', function () { const list: IIndexTreeNode[] = []; const model = new IndexTreeModel('test', toSpliceable(list), -1); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { - element: 0, children: Iterator.fromArray([ + element: 0, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(model.getNodeLocation(list[0]), [0]); assert.deepEqual(model.getNodeLocation(list[1]), [0, 0]); @@ -672,7 +671,7 @@ suite('IndexTreeModel', function () { const model = new IndexTreeModel('test', toSpliceable(list), -1, { filter }); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { element: 0, children: [ { element: 1 }, @@ -684,7 +683,7 @@ suite('IndexTreeModel', function () { { element: 7 } ] } - ])); + ]); assert.deepEqual(model.getNodeLocation(list[0]), [0]); assert.deepEqual(model.getNodeLocation(list[1]), [0, 1]); @@ -704,11 +703,11 @@ suite('IndexTreeModel', function () { const model = new IndexTreeModel('test', toSpliceable(list), 'root', { filter }); - model.splice([0], 0, Iterator.fromArray([ + model.splice([0], 0, [ { element: 'silver' }, { element: 'gold' }, { element: 'platinum' } - ])); + ]); assert.deepEqual(toArray(list), ['silver', 'gold', 'platinum']); @@ -716,11 +715,11 @@ suite('IndexTreeModel', function () { model.refilter(); assert.deepEqual(toArray(list), ['platinum']); - model.splice([0], Number.POSITIVE_INFINITY, Iterator.fromArray([ + model.splice([0], Number.POSITIVE_INFINITY, [ { element: 'silver' }, { element: 'gold' }, { element: 'platinum' } - ])); + ]); assert.deepEqual(toArray(list), ['platinum']); model.refilter(); diff --git a/src/vs/base/test/browser/ui/tree/objectTree.test.ts b/src/vs/base/test/browser/ui/tree/objectTree.test.ts index d384c368d6e..166a99c00b3 100644 --- a/src/vs/base/test/browser/ui/tree/objectTree.test.ts +++ b/src/vs/base/test/browser/ui/tree/objectTree.test.ts @@ -7,7 +7,6 @@ import * as assert from 'assert'; import { ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; import { IListVirtualDelegate, IIdentityProvider } from 'vs/base/browser/ui/list/list'; import { ObjectTree, CompressibleObjectTree, ICompressibleTreeRenderer } from 'vs/base/browser/ui/tree/objectTree'; -import { Iterator } from 'vs/base/common/iterator'; import { ICompressedTreeNode } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; suite('ObjectTree', function () { @@ -46,17 +45,17 @@ suite('ObjectTree', function () { }); test('should be able to navigate', () => { - tree.setChildren(null, Iterator.fromArray([ + tree.setChildren(null, [ { - element: 0, children: Iterator.fromArray([ + element: 0, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); const navigator = tree.navigate(); @@ -87,17 +86,17 @@ suite('ObjectTree', function () { }); test('should skip collapsed nodes', () => { - tree.setChildren(null, Iterator.fromArray([ + tree.setChildren(null, [ { - element: 0, collapsed: true, children: Iterator.fromArray([ + element: 0, collapsed: true, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); const navigator = tree.navigate(); @@ -118,17 +117,17 @@ suite('ObjectTree', function () { test('should skip filtered elements', () => { filter = el => el % 2 === 0; - tree.setChildren(null, Iterator.fromArray([ + tree.setChildren(null, [ { - element: 0, children: Iterator.fromArray([ + element: 0, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); const navigator = tree.navigate(); @@ -150,17 +149,17 @@ suite('ObjectTree', function () { }); test('should be able to start from node', () => { - tree.setChildren(null, Iterator.fromArray([ + tree.setChildren(null, [ { - element: 0, children: Iterator.fromArray([ + element: 0, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); const navigator = tree.navigate(1); @@ -291,50 +290,50 @@ suite('CompressibleObjectTree', function () { const tree = new CompressibleObjectTree('test', container, new Delegate(), [new Renderer()]); tree.layout(200); - tree.setChildren(null, Iterator.fromArray([ + tree.setChildren(null, [ { - element: 1, children: Iterator.fromArray([{ - element: 11, children: Iterator.fromArray([{ - element: 111, children: Iterator.fromArray([ + element: 1, children: [{ + element: 11, children: [{ + element: 111, children: [ { element: 1111 }, { element: 1112 }, { element: 1113 }, - ]) - }]) - }]) + ] + }] + }] } - ])); + ]); let rows = toArray(container.querySelectorAll('.monaco-tl-contents')).map(row => row.textContent); assert.deepEqual(rows, ['1/11/111', '1111', '1112', '1113']); - tree.setChildren(11, Iterator.fromArray([ + tree.setChildren(11, [ { element: 111 }, { element: 112 }, { element: 113 }, - ])); + ]); rows = toArray(container.querySelectorAll('.monaco-tl-contents')).map(row => row.textContent); assert.deepEqual(rows, ['1/11', '111', '112', '113']); - tree.setChildren(113, Iterator.fromArray([ + tree.setChildren(113, [ { element: 1131 } - ])); + ]); rows = toArray(container.querySelectorAll('.monaco-tl-contents')).map(row => row.textContent); assert.deepEqual(rows, ['1/11', '111', '112', '113/1131']); - tree.setChildren(1131, Iterator.fromArray([ + tree.setChildren(1131, [ { element: 1132 } - ])); + ]); rows = toArray(container.querySelectorAll('.monaco-tl-contents')).map(row => row.textContent); assert.deepEqual(rows, ['1/11', '111', '112', '113/1131/1132']); - tree.setChildren(1131, Iterator.fromArray([ + tree.setChildren(1131, [ { element: 1132 }, { element: 1133 }, - ])); + ]); rows = toArray(container.querySelectorAll('.monaco-tl-contents')).map(row => row.textContent); assert.deepEqual(rows, ['1/11', '111', '112', '113/1131', '1132', '1133']); @@ -348,19 +347,19 @@ suite('CompressibleObjectTree', function () { const tree = new CompressibleObjectTree('test', container, new Delegate(), [new Renderer()]); tree.layout(200); - tree.setChildren(null, Iterator.fromArray([ + tree.setChildren(null, [ { - element: 1, children: Iterator.fromArray([{ - element: 11, children: Iterator.fromArray([{ - element: 111, children: Iterator.fromArray([ + element: 1, children: [{ + element: 11, children: [{ + element: 111, children: [ { element: 1111 }, { element: 1112 }, { element: 1113 }, - ]) - }]) - }]) + ] + }] + }] } - ])); + ]); let rows = toArray(container.querySelectorAll('.monaco-tl-contents')).map(row => row.textContent); assert.deepEqual(rows, ['1/11/111', '1111', '1112', '1113']); diff --git a/src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts b/src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts index 66ecd17238f..3f658685fce 100644 --- a/src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts +++ b/src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts @@ -7,7 +7,6 @@ import * as assert from 'assert'; import { ITreeNode } from 'vs/base/browser/ui/tree/tree'; import { ISpliceable } from 'vs/base/common/sequence'; import { ObjectTreeModel } from 'vs/base/browser/ui/tree/objectTreeModel'; -import { Iterator } from 'vs/base/common/iterator'; function toSpliceable(arr: T[]): ISpliceable { return { @@ -35,25 +34,25 @@ suite('ObjectTreeModel', function () { const list: ITreeNode[] = []; const model = new ObjectTreeModel('test', toSpliceable(list)); - model.setChildren(null, Iterator.fromArray([ + model.setChildren(null, [ { element: 0 }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(toArray(list), [0, 1, 2]); assert.equal(model.size, 3); - model.setChildren(null, Iterator.fromArray([ + model.setChildren(null, [ { element: 3 }, { element: 4 }, { element: 5 }, - ])); + ]); assert.deepEqual(toArray(list), [3, 4, 5]); assert.equal(model.size, 3); - model.setChildren(null, Iterator.empty()); + model.setChildren(null); assert.deepEqual(toArray(list), []); assert.equal(model.size, 0); }); @@ -62,34 +61,34 @@ suite('ObjectTreeModel', function () { const list: ITreeNode[] = []; const model = new ObjectTreeModel('test', toSpliceable(list)); - model.setChildren(null, Iterator.fromArray([ + model.setChildren(null, [ { - element: 0, children: Iterator.fromArray([ + element: 0, children: [ { element: 10 }, { element: 11 }, { element: 12 }, - ]) + ] }, { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(toArray(list), [0, 10, 11, 12, 1, 2]); assert.equal(model.size, 6); - model.setChildren(12, Iterator.fromArray([ + model.setChildren(12, [ { element: 120 }, { element: 121 } - ])); + ]); assert.deepEqual(toArray(list), [0, 10, 11, 12, 120, 121, 1, 2]); assert.equal(model.size, 8); - model.setChildren(0, Iterator.empty()); + model.setChildren(0); assert.deepEqual(toArray(list), [0, 1, 2]); assert.equal(model.size, 3); - model.setChildren(null, Iterator.empty()); + model.setChildren(null); assert.deepEqual(toArray(list), []); assert.equal(model.size, 0); }); @@ -98,16 +97,16 @@ suite('ObjectTreeModel', function () { const list: ITreeNode[] = []; const model = new ObjectTreeModel('test', toSpliceable(list)); - model.setChildren(null, Iterator.fromArray([ + model.setChildren(null, [ { element: 0, collapsed: true } - ])); + ]); assert.deepEqual(toArray(list), [0]); - model.setChildren(0, Iterator.fromArray([ + model.setChildren(0, [ { element: 1 }, { element: 2 } - ])); + ]); assert.deepEqual(toArray(list), [0]); diff --git a/src/vs/workbench/contrib/markers/browser/markersView.ts b/src/vs/workbench/contrib/markers/browser/markersView.ts index 5bc57f81a4a..3c21984173c 100644 --- a/src/vs/workbench/contrib/markers/browser/markersView.ts +++ b/src/vs/workbench/contrib/markers/browser/markersView.ts @@ -23,7 +23,7 @@ import { IMarkersWorkbenchService } from 'vs/workbench/contrib/markers/browser/m import { IStorageService, StorageScope } from 'vs/platform/storage/common/storage'; import { localize } from 'vs/nls'; import { IContextKey, IContextKeyService, ContextKeyEqualsExpr, ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey'; -import { Iterator } from 'vs/base/common/iterator'; +import { Iterable } from 'vs/base/common/iterator'; import { ITreeElement, ITreeNode, ITreeContextMenuEvent, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; import { Relay, Event, Emitter } from 'vs/base/common/event'; import { WorkbenchObjectTree, ResourceNavigator, IListService, IWorkbenchObjectTreeOptions } from 'vs/platform/list/browser/listService'; @@ -50,16 +50,13 @@ import { ViewPane, IViewPaneOptions } from 'vs/workbench/browser/parts/views/vie import { IViewDescriptorService } from 'vs/workbench/common/views'; import { IOpenerService } from 'vs/platform/opener/common/opener'; -function createResourceMarkersIterator(resourceMarkers: ResourceMarkers): Iterator> { - const markersIt = Iterator.fromArray(resourceMarkers.markers); - - return Iterator.map(markersIt, m => { - const relatedInformationIt = Iterator.from(m.relatedInformation); - const children = Iterator.map(relatedInformationIt, r => ({ element: r })); +function createResourceMarkersIterator(resourceMarkers: ResourceMarkers): Iterable> { + return Iterable.map(resourceMarkers.markers, m => { + const relatedInformationIt = Iterable.from(m.relatedInformation); + const children = Iterable.map(relatedInformationIt, r => ({ element: r })); return { element: m, children }; }); - } export class MarkersView extends ViewPane implements IMarkerFilterController { @@ -338,7 +335,7 @@ export class MarkersView extends ViewPane implements IMarkerFilterController { } else { resourceMarkers = this.markersWorkbenchService.markersModel.resourceMarkers; } - this.tree.setChildren(null, Iterator.map(Iterator.fromArray(resourceMarkers), m => ({ element: m, children: createResourceMarkersIterator(m) }))); + this.tree.setChildren(null, Iterable.map(resourceMarkers, m => ({ element: m, children: createResourceMarkersIterator(m) }))); } private updateFilter() { diff --git a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts index ea9f21f3952..defc8ec4dd4 100644 --- a/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts +++ b/src/vs/workbench/contrib/preferences/browser/settingsEditor2.ts @@ -14,7 +14,7 @@ import { Delayer, ThrottledDelayer, timeout, IntervalTimer } from 'vs/base/commo import { CancellationToken, CancellationTokenSource } from 'vs/base/common/cancellation'; import * as collections from 'vs/base/common/collections'; import { getErrorMessage, isPromiseCanceledError } from 'vs/base/common/errors'; -import { Iterator } from 'vs/base/common/iterator'; +import { Iterable } from 'vs/base/common/iterator'; import { KeyCode } from 'vs/base/common/keyCodes'; import { Disposable } from 'vs/base/common/lifecycle'; import * as platform from 'vs/base/common/platform'; @@ -55,10 +55,8 @@ import { SettingsEditor2Input } from 'vs/workbench/services/preferences/common/p import { Settings2EditorModel } from 'vs/workbench/services/preferences/common/preferencesModels'; import { fromNow } from 'vs/base/common/date'; -function createGroupIterator(group: SettingsTreeGroupElement): Iterator> { - const groupsIt = Iterator.fromArray(group.children); - - return Iterator.map(groupsIt, g => { +function createGroupIterator(group: SettingsTreeGroupElement): Iterable> { + return Iterable.map(group.children, g => { return { element: g, children: g instanceof SettingsTreeGroupElement ? diff --git a/src/vs/workbench/contrib/preferences/browser/tocTree.ts b/src/vs/workbench/contrib/preferences/browser/tocTree.ts index 1120b48feca..5ba8d7f215f 100644 --- a/src/vs/workbench/contrib/preferences/browser/tocTree.ts +++ b/src/vs/workbench/contrib/preferences/browser/tocTree.ts @@ -8,7 +8,7 @@ import { IListVirtualDelegate } from 'vs/base/browser/ui/list/list'; import { DefaultStyleController, IAccessibilityProvider } from 'vs/base/browser/ui/list/listWidget'; import { IObjectTreeOptions, ObjectTree } from 'vs/base/browser/ui/tree/objectTree'; import { ITreeElement, ITreeNode, ITreeRenderer } from 'vs/base/browser/ui/tree/tree'; -import { Iterator } from 'vs/base/common/iterator'; +import { Iterable } from 'vs/base/common/iterator'; import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation'; import { editorBackground, transparent, foreground } from 'vs/platform/theme/common/colorRegistry'; import { attachStyler } from 'vs/platform/theme/common/styler'; @@ -138,11 +138,10 @@ class TOCTreeDelegate implements IListVirtualDelegate { } } -export function createTOCIterator(model: TOCTreeModel | SettingsTreeGroupElement, tree: TOCTree): Iterator> { +export function createTOCIterator(model: TOCTreeModel | SettingsTreeGroupElement, tree: TOCTree): Iterable> { const groupChildren = model.children.filter(c => c instanceof SettingsTreeGroupElement); - const groupsIt = Iterator.fromArray(groupChildren); - return Iterator.map(groupsIt, g => { + return Iterable.map(groupChildren, g => { const hasGroupChildren = g.children.some(c => c instanceof SettingsTreeGroupElement); return { diff --git a/src/vs/workbench/contrib/scm/browser/repositoryPane.ts b/src/vs/workbench/contrib/scm/browser/repositoryPane.ts index 0691d524552..88625d3ccbf 100644 --- a/src/vs/workbench/contrib/scm/browser/repositoryPane.ts +++ b/src/vs/workbench/contrib/scm/browser/repositoryPane.ts @@ -35,7 +35,7 @@ import { ITreeNode, ITreeFilter, ITreeSorter, ITreeContextMenuEvent } from 'vs/b import { ResourceTree, IResourceNode } from 'vs/base/common/resourceTree'; import { ISequence, ISplice } from 'vs/base/common/sequence'; import { ICompressibleTreeRenderer, ICompressibleKeyboardNavigationLabelProvider } from 'vs/base/browser/ui/tree/objectTree'; -import { Iterator } from 'vs/base/common/iterator'; +import { Iterable } from 'vs/base/common/iterator'; import { ICompressedTreeNode, ICompressedTreeElement } from 'vs/base/browser/ui/tree/compressedObjectTreeModel'; import { URI } from 'vs/base/common/uri'; import { FileKind } from 'vs/platform/files/common/files'; @@ -397,8 +397,8 @@ interface IGroupItem { function groupItemAsTreeElement(item: IGroupItem, mode: ViewModelMode): ICompressedTreeElement { const children = mode === ViewModelMode.List - ? Iterator.map(Iterator.fromArray(item.resources), element => ({ element, incompressible: true })) - : Iterator.map(item.tree.root.children, node => asTreeElement(node, true)); + ? Iterable.map(item.resources, element => ({ element, incompressible: true })) + : Iterable.map(item.tree.root.children, node => asTreeElement(node, true)); return { element: item.group, children, incompressible: true, collapsible: true }; } @@ -406,7 +406,7 @@ function groupItemAsTreeElement(item: IGroupItem, mode: ViewModelMode): ICompres function asTreeElement(node: IResourceNode, forceIncompressible: boolean): ICompressedTreeElement { return { element: (node.childrenCount === 0 && node.element) ? node.element : node, - children: Iterator.map(node.children, node => asTreeElement(node, false)), + children: Iterable.map(node.children, node => asTreeElement(node, false)), incompressible: !!node.element || forceIncompressible }; } diff --git a/src/vs/workbench/contrib/search/browser/searchView.ts b/src/vs/workbench/contrib/search/browser/searchView.ts index d3024273740..4710c33c076 100644 --- a/src/vs/workbench/contrib/search/browser/searchView.ts +++ b/src/vs/workbench/contrib/search/browser/searchView.ts @@ -13,7 +13,7 @@ import { IAction, ActionRunner } from 'vs/base/common/actions'; import { Delayer } from 'vs/base/common/async'; import * as errors from 'vs/base/common/errors'; import { Event } from 'vs/base/common/event'; -import { Iterator } from 'vs/base/common/iterator'; +import { Iterable } from 'vs/base/common/iterator'; import { KeyCode, KeyMod } from 'vs/base/common/keyCodes'; import { dispose, IDisposable } from 'vs/base/common/lifecycle'; import * as env from 'vs/base/common/platform'; @@ -533,7 +533,7 @@ export class SearchView extends ViewPane { } } - private createResultIterator(collapseResults: ISearchConfigurationProperties['collapseResults']): Iterator> { + private createResultIterator(collapseResults: ISearchConfigurationProperties['collapseResults']): Iterable> { const folderMatches = this.searchResult.folderMatches() .filter(fm => !fm.isEmpty()) .sort(searchMatchComparer); @@ -542,20 +542,17 @@ export class SearchView extends ViewPane { return this.createFolderIterator(folderMatches[0], collapseResults); } - const foldersIt = Iterator.fromArray(folderMatches); - return Iterator.map(foldersIt, folderMatch => { + return Iterable.map(folderMatches, folderMatch => { const children = this.createFolderIterator(folderMatch, collapseResults); return >{ element: folderMatch, children }; }); } - private createFolderIterator(folderMatch: FolderMatch, collapseResults: ISearchConfigurationProperties['collapseResults']): Iterator> { + private createFolderIterator(folderMatch: FolderMatch, collapseResults: ISearchConfigurationProperties['collapseResults']): Iterable> { const sortOrder = this.searchConfig.sortOrder; - const filesIt = Iterator.fromArray( - folderMatch.matches() - .sort((a, b) => searchMatchComparer(a, b, sortOrder))); + const matches = folderMatch.matches().sort((a, b) => searchMatchComparer(a, b, sortOrder)); - return Iterator.map(filesIt, fileMatch => { + return Iterable.map(matches, fileMatch => { const children = this.createFileIterator(fileMatch); let nodeExists = true; @@ -568,14 +565,12 @@ export class SearchView extends ViewPane { }); } - private createFileIterator(fileMatch: FileMatch): Iterator> { - const matchesIt = Iterator.from( - fileMatch.matches() - .sort(searchMatchComparer)); - return Iterator.map(matchesIt, r => (>{ element: r })); + private createFileIterator(fileMatch: FileMatch): Iterable> { + const matches = fileMatch.matches().sort(searchMatchComparer); + return Iterable.map(matches, r => (>{ element: r })); } - private createIterator(match: FolderMatch | FileMatch | SearchResult, collapseResults: ISearchConfigurationProperties['collapseResults']): Iterator> { + private createIterator(match: FolderMatch | FileMatch | SearchResult, collapseResults: ISearchConfigurationProperties['collapseResults']): Iterable> { return match instanceof SearchResult ? this.createResultIterator(collapseResults) : match instanceof FolderMatch ? this.createFolderIterator(match, collapseResults) : this.createFileIterator(match); From 000637b7082910b6e2b36b499895d6d2d5595518 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 6 Apr 2020 15:26:33 +0200 Subject: [PATCH 2/3] remove old iterator and utils --- src/vs/base/common/iterator.ts | 209 ----------------------- src/vs/base/common/map.ts | 2 +- src/vs/base/test/common/iterator.test.ts | 14 +- 3 files changed, 2 insertions(+), 223 deletions(-) diff --git a/src/vs/base/common/iterator.ts b/src/vs/base/common/iterator.ts index cf2cd832dd3..00f226830a0 100644 --- a/src/vs/base/common/iterator.ts +++ b/src/vs/base/common/iterator.ts @@ -3,37 +3,6 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -export interface IteratorDefinedResult { - readonly done: false; - readonly value: T; -} -export interface IteratorUndefinedResult { - readonly done: true; - readonly value: undefined; -} -export const FIN: IteratorUndefinedResult = { done: true, value: undefined }; -export type IteratorResult = IteratorDefinedResult | IteratorUndefinedResult; - -export interface Iterator { - next(): IteratorResult; -} - -interface NativeIteratorYieldResult { - done?: false; - value: TYield; -} - -interface NativeIteratorReturnResult { - done: true; - value: TReturn; -} - -type NativeIteratorResult = NativeIteratorYieldResult | NativeIteratorReturnResult; - -export interface NativeIterator { - next(): NativeIteratorResult; -} - export namespace Iterable { const _empty: Iterable = Object.freeze([]); @@ -107,184 +76,6 @@ export namespace Iterable { } } -export module Iterator { - const _empty: Iterator = { - next() { - return FIN; - } - }; - - export function empty(): Iterator { - return _empty; - } - - export function single(value: T): Iterator { - let done = false; - - return { - next(): IteratorResult { - if (done) { - return FIN; - } - - done = true; - return { done: false, value }; - } - }; - } - - export function fromArray(array: ReadonlyArray, index = 0, length = array.length): Iterator { - return { - next(): IteratorResult { - if (index >= length) { - return FIN; - } - - return { done: false, value: array[index++] }; - } - }; - } - - export function fromNativeIterator(it: NativeIterator): Iterator { - return { - next(): IteratorResult { - const result = it.next(); - - if (result.done) { - return FIN; - } - - return { done: false, value: result.value }; - } - }; - } - - export function from(elements: Iterator | T[] | undefined): Iterator { - if (!elements) { - return Iterator.empty(); - } else if (Array.isArray(elements)) { - return Iterator.fromArray(elements); - } else { - return elements; - } - } - - export function map(iterator: Iterator, fn: (t: T) => R): Iterator { - return { - next() { - const element = iterator.next(); - if (element.done) { - return FIN; - } else { - return { done: false, value: fn(element.value) }; - } - } - }; - } - - export function filter(iterator: Iterator, fn: (t: T) => boolean): Iterator { - return { - next() { - while (true) { - const element = iterator.next(); - if (element.done) { - return FIN; - } - if (fn(element.value)) { - return { done: false, value: element.value }; - } - } - } - }; - } - - export function some(iterator: Iterator | NativeIterator, fn: (t: T) => boolean): boolean { - while (true) { - const element = iterator.next(); - if (element.done) { - return false; - } - - if (fn(element.value)) { - return true; - } - } - } - - export function forEach(iterator: Iterator, fn: (t: T) => void): void { - for (let next = iterator.next(); !next.done; next = iterator.next()) { - fn(next.value); - } - } - - export function collect(iterator: Iterator, atMost: number = Number.POSITIVE_INFINITY): T[] { - const result: T[] = []; - - if (atMost === 0) { - return result; - } - - let i = 0; - - for (let next = iterator.next(); !next.done; next = iterator.next()) { - result.push(next.value); - - if (++i >= atMost) { - break; - } - } - - return result; - } - - export function concat(...iterators: Iterator[]): Iterator { - let i = 0; - - return { - next() { - if (i >= iterators.length) { - return FIN; - } - - const iterator = iterators[i]; - const result = iterator.next(); - - if (result.done) { - i++; - return this.next(); - } - - return result; - } - }; - } - - export function chain(iterator: Iterator): ChainableIterator { - return new ChainableIterator(iterator); - } -} - -export class ChainableIterator implements Iterator { - - constructor(private it: Iterator) { } - - next(): IteratorResult { return this.it.next(); } - map(fn: (t: T) => R): ChainableIterator { return new ChainableIterator(Iterator.map(this.it, fn)); } - filter(fn: (t: T) => boolean): ChainableIterator { return new ChainableIterator(Iterator.filter(this.it, fn)); } -} - -export type ISequence = Iterator | T[]; - -export function getSequenceIterator(arg: ISequence | undefined): Iterator { - if (Array.isArray(arg)) { - return Iterator.fromArray(arg); - } else if (!arg) { - return Iterator.empty(); - } else { - return arg; - } -} - export interface INextIterator { next(): T | null; } diff --git a/src/vs/base/common/map.ts b/src/vs/base/common/map.ts index 8b5639ed13b..2bc59fcf3d5 100644 --- a/src/vs/base/common/map.ts +++ b/src/vs/base/common/map.ts @@ -369,7 +369,7 @@ export class TernarySearchTree { this._forEach(node, value => data.push(value)); } if (idx >= data.length) { - return FIN; + return { done: true, value: undefined }; } if (!res) { diff --git a/src/vs/base/test/common/iterator.test.ts b/src/vs/base/test/common/iterator.test.ts index 1c55ff69be7..7f32bc3eb6a 100644 --- a/src/vs/base/test/common/iterator.test.ts +++ b/src/vs/base/test/common/iterator.test.ts @@ -4,19 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import * as assert from 'assert'; -import { Iterator, Iterable } from 'vs/base/common/iterator'; - -suite('Iterator', () => { - test('concat', () => { - const first = Iterator.fromArray([1, 2, 3]); - const second = Iterator.fromArray([4, 5, 6]); - const third = Iterator.fromArray([7, 8, 9]); - const actualIterator = Iterator.concat(first, second, third); - const actual = Iterator.collect(actualIterator); - - assert.deepEqual(actual, [1, 2, 3, 4, 5, 6, 7, 8, 9]); - }); -}); +import { Iterable } from 'vs/base/common/iterator'; suite('Iterable', function () { From 014c7b708787918064e246bdc0e25960e74bfcdd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Moreno?= Date: Mon, 6 Apr 2020 15:28:54 +0200 Subject: [PATCH 3/3] forgot one line --- src/vs/base/common/map.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/vs/base/common/map.ts b/src/vs/base/common/map.ts index 2bc59fcf3d5..19f4ce01c1d 100644 --- a/src/vs/base/common/map.ts +++ b/src/vs/base/common/map.ts @@ -5,7 +5,6 @@ import { URI } from 'vs/base/common/uri'; import { CharCode } from 'vs/base/common/charCode'; -import { FIN } from './iterator'; /** * @deprecated ES6: use `[...SetOrMap.values()]`