mirror of
https://github.com/microsoft/vscode.git
synced 2026-09-25 00:44:05 +01:00
tree with iterators
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user