From 28e2130870d4855d760581086a2bce83c4e39cce Mon Sep 17 00:00:00 2001 From: Joao Moreno Date: Fri, 22 Jun 2018 22:52:50 +0200 Subject: [PATCH] tree with iterators --- src/vs/base/common/tree.ts | 26 ++++++++- src/vs/base/test/common/tree.test.ts | 81 ++++++++++++++-------------- 2 files changed, 65 insertions(+), 42 deletions(-) diff --git a/src/vs/base/common/tree.ts b/src/vs/base/common/tree.ts index 5475a8fb573..9fc081e5ef2 100644 --- a/src/vs/base/common/tree.ts +++ b/src/vs/base/common/tree.ts @@ -6,17 +6,37 @@ 'use strict'; import { tail2, last } from 'vs/base/common/arrays'; +import { IIterator, map, iter, collect } from 'vs/base/common/iterator'; + +export interface ITreeElement { + readonly element: T; + readonly children: IIterator>; +} export interface ITreeNode { readonly element: T; readonly children: ITreeNode[]; } +function asNode(element: ITreeElement): ITreeNode { + return { + element: element.element, + children: collect(map(element.children, asNode)) + }; +} + +function asElement(element: ITreeNode): ITreeElement { + return { + element: element.element, + children: map(iter(element.children), asElement) + }; +} + export class Tree { private root: ITreeNode = { element: undefined, children: [] }; - splice(start: number[], deleteCount: number, nodes: ITreeNode[] = []): ITreeNode[] { + splice(start: number[], deleteCount: number, elements: IIterator>): IIterator> { if (start.length === 0) { throw new Error('Invalid tree location'); } @@ -24,8 +44,10 @@ export class Tree { const [rest, index] = tail2(start); const parentPath = this.getNodePath(rest); const parent = last(parentPath); + const nodes = collect(map(elements, asNode)); + const deletedNodes = parent.children.splice(index, deleteCount, ...nodes); - return parent.children.splice(index, deleteCount, ...nodes); + return map(iter(deletedNodes), asElement); } getElement(location: number[]): T { diff --git a/src/vs/base/test/common/tree.test.ts b/src/vs/base/test/common/tree.test.ts index f750300dc52..9289fe8ed76 100644 --- a/src/vs/base/test/common/tree.test.ts +++ b/src/vs/base/test/common/tree.test.ts @@ -5,6 +5,7 @@ import * as assert from 'assert'; import { Tree } from 'vs/base/common/tree'; +import { iter } from 'vs/base/common/iterator'; suite('Base Tree', () => { @@ -19,11 +20,11 @@ suite('Base Tree', () => { test('insert', () => { const tree = new Tree(); - tree.splice([0], 0, [ - { element: 0, children: [] }, - { element: 1, children: [] }, - { element: 2, children: [] } - ]); + tree.splice([0], 0, iter([ + { element: 0, children: iter([]) }, + { element: 1, children: iter([]) }, + { element: 2, children: iter([]) } + ])); const nodes = tree.getNodes(); assert.deepEqual(nodes.length, 3); @@ -35,17 +36,17 @@ suite('Base Tree', () => { test('deep insert', () => { const tree = new Tree(); - tree.splice([0], 0, [ + tree.splice([0], 0, iter([ { - element: 0, children: [ - { element: 10, children: [] }, - { element: 11, children: [] }, - { element: 12, children: [] }, - ] + element: 0, children: iter([ + { element: 10, children: iter([]) }, + { element: 11, children: iter([]) }, + { element: 12, children: iter([]) }, + ]) }, - { element: 1, children: [] }, - { element: 2, children: [] } - ]); + { element: 1, children: iter([]) }, + { element: 2, children: iter([]) } + ])); const nodes = tree.getNodes(); assert.deepEqual(nodes.length, 3); @@ -61,13 +62,13 @@ suite('Base Tree', () => { test('delete', () => { const tree = new Tree(); - tree.splice([0], 0, [ - { element: 0, children: [] }, - { element: 1, children: [] }, - { element: 2, children: [] } - ]); + tree.splice([0], 0, iter([ + { element: 0, children: iter([]) }, + { element: 1, children: iter([]) }, + { element: 2, children: iter([]) } + ])); - tree.splice([0], 3, []); + tree.splice([0], 3, iter([])); const nodes = tree.getNodes(); assert.equal(nodes.length, 0); @@ -76,19 +77,19 @@ suite('Base Tree', () => { test('nested delete', () => { const tree = new Tree(); - tree.splice([0], 0, [ + tree.splice([0], 0, iter([ { - element: 0, children: [ - { element: 10, children: [] }, - { element: 11, children: [] }, - { element: 12, children: [] }, - ] + element: 0, children: iter([ + { element: 10, children: iter([]) }, + { element: 11, children: iter([]) }, + { element: 12, children: iter([]) }, + ]) }, - { element: 1, children: [] }, - { element: 2, children: [] } - ]); + { element: 1, children: iter([]) }, + { element: 2, children: iter([]) } + ])); - tree.splice([0, 1], 1, []); + tree.splice([0, 1], 1, iter([])); const nodes = tree.getNodes(); assert.deepEqual(nodes.length, 3); @@ -103,19 +104,19 @@ suite('Base Tree', () => { test('deep delete', () => { const tree = new Tree(); - tree.splice([0], 0, [ + tree.splice([0], 0, iter([ { - element: 0, children: [ - { element: 10, children: [] }, - { element: 11, children: [] }, - { element: 12, children: [] }, - ] + element: 0, children: iter([ + { element: 10, children: iter([]) }, + { element: 11, children: iter([]) }, + { element: 12, children: iter([]) }, + ]) }, - { element: 1, children: [] }, - { element: 2, children: [] } - ]); + { element: 1, children: iter([]) }, + { element: 2, children: iter([]) } + ])); - tree.splice([0], 1, []); + tree.splice([0], 1, iter([])); const nodes = tree.getNodes(); assert.deepEqual(nodes.length, 2);