tree with iterators

This commit is contained in:
Joao Moreno
2018-06-22 22:52:50 +02:00
parent a25a9b8083
commit 28e2130870
2 changed files with 65 additions and 42 deletions
+24 -2
View File
@@ -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<T> {
readonly element: T;
readonly children: IIterator<ITreeElement<T>>;
}
export interface ITreeNode<T> {
readonly element: T;
readonly children: ITreeNode<T>[];
}
function asNode<T>(element: ITreeElement<T>): ITreeNode<T> {
return {
element: element.element,
children: collect(map(element.children, asNode))
};
}
function asElement<T>(element: ITreeNode<T>): ITreeElement<T> {
return {
element: element.element,
children: map(iter(element.children), asElement)
};
}
export class Tree<T> {
private root: ITreeNode<T> = { element: undefined, children: [] };
splice(start: number[], deleteCount: number, nodes: ITreeNode<T>[] = []): ITreeNode<T>[] {
splice(start: number[], deleteCount: number, elements: IIterator<ITreeElement<T>>): IIterator<ITreeElement<T>> {
if (start.length === 0) {
throw new Error('Invalid tree location');
}
@@ -24,8 +44,10 @@ export class Tree<T> {
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 {
+41 -40
View File
@@ -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<number>();
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<number>();
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<number>();
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<number>();
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<number>();
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);