提交 55544750 编写于 作者: J Joao Moreno

list: change range map splice call

上级 6f4827fb
......@@ -3,8 +3,7 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
export interface IGroup {
count: number;
export interface IItem {
size: number;
}
......@@ -115,28 +114,17 @@ export class RangeMap {
private groups: IRangedGroup[] = [];
private _size = 0;
splice(index: number, deleteCount: number, ...groups: IGroup[]): void {
let diff = -deleteCount;
let index2 = index;
const middle = groups
.filter(g => g.count > 0 && g.size > 0)
.map<IRangedGroup>(g => {
const end = index2 + g.count;
const result = {
range: { start: index2, end },
size: g.size
};
diff += g.count;
index2 = end;
return result;
});
splice(index: number, deleteCount: number, ...items: IItem[]): void {
const diff = items.length - deleteCount;
const before = groupIntersect({ start: 0, end: index }, this.groups);
const after = groupIntersect({ start: index + deleteCount, end: Number.POSITIVE_INFINITY }, this.groups)
.map<IRangedGroup>(g => ({ range: shift(g.range, diff), size: g.size }));
const middle = items.map<IRangedGroup>((item, i) => ({
range: { start: index + i, end: index + i + 1 },
size: item.size
}));
this.groups = concat(before, middle, after);
this._size = this.groups.reduce((t, g) => t + (g.size * (g.range.end - g.range.start)), 0);
}
......
......@@ -148,50 +148,59 @@ suite('RangeMap', () => {
assert.equal(rangeMap.count, 0);
});
const one = { size: 1 };
const two = { size: 2 };
const three = { size: 3 };
const five = { size: 5 };
const ten = { size: 10 };
test('length & count', () => {
rangeMap.splice(0, 0, { count: 1, size: 1 });
rangeMap.splice(0, 0, one);
assert.equal(rangeMap.size, 1);
assert.equal(rangeMap.count, 1);
});
test('length & count #2', () => {
rangeMap.splice(0, 0, { count: 5, size: 1 });
rangeMap.splice(0, 0, one, one, one, one, one);
assert.equal(rangeMap.size, 5);
assert.equal(rangeMap.count, 5);
});
test('length & count #3', () => {
rangeMap.splice(0, 0, { count: 1, size: 5 });
rangeMap.splice(0, 0, five);
assert.equal(rangeMap.size, 5);
assert.equal(rangeMap.count, 1);
});
test('length & count #4', () => {
rangeMap.splice(0, 0, { count: 5, size: 5 });
rangeMap.splice(0, 0, five, five, five, five, five);
assert.equal(rangeMap.size, 25);
assert.equal(rangeMap.count, 5);
});
test('insert', () => {
rangeMap.splice(0, 0, { count: 5, size: 5 });
rangeMap.splice(0, 0, five, five, five, five, five);
assert.equal(rangeMap.size, 25);
assert.equal(rangeMap.count, 5);
rangeMap.splice(0, 0, { count: 5, size: 5 });
rangeMap.splice(0, 0, five, five, five, five, five);
assert.equal(rangeMap.size, 50);
assert.equal(rangeMap.count, 10);
rangeMap.splice(5, 0, { count: 2, size: 10 });
rangeMap.splice(5, 0, ten, ten);
assert.equal(rangeMap.size, 70);
assert.equal(rangeMap.count, 12);
rangeMap.splice(12, 0, { count: 1, size: 200 });
rangeMap.splice(12, 0, { size: 200 });
assert.equal(rangeMap.size, 270);
assert.equal(rangeMap.count, 13);
});
test('delete', () => {
rangeMap.splice(0, 0, { count: 20, size: 5 });
rangeMap.splice(0, 0, five, five, five, five, five,
five, five, five, five, five,
five, five, five, five, five,
five, five, five, five, five);
assert.equal(rangeMap.size, 100);
assert.equal(rangeMap.count, 20);
......@@ -216,7 +225,7 @@ suite('RangeMap', () => {
assert.equal(rangeMap.size, 0);
assert.equal(rangeMap.count, 0);
rangeMap.splice(0, 0, { count: 1, size: 1 });
rangeMap.splice(0, 0, one);
assert.equal(rangeMap.size, 1);
assert.equal(rangeMap.count, 1);
......@@ -226,22 +235,29 @@ suite('RangeMap', () => {
});
test('insert & delete #2', () => {
rangeMap.splice(0, 0, { count: 10, size: 1 });
rangeMap.splice(0, 0, one, one, one, one, one,
one, one, one, one, one);
rangeMap.splice(2, 6);
assert.equal(rangeMap.count, 4);
assert.equal(rangeMap.size, 4);
});
test('insert & delete #3', () => {
rangeMap.splice(0, 0, { count: 10, size: 1 }, { count: 10, size: 2 });
rangeMap.splice(0, 0, one, one, one, one, one,
one, one, one, one, one,
two, two, two, two, two,
two, two, two, two, two);
rangeMap.splice(8, 4);
assert.equal(rangeMap.count, 16);
assert.equal(rangeMap.size, 24);
});
test('insert & delete #3', () => {
rangeMap.splice(0, 0, { count: 10, size: 1 }, { count: 10, size: 2 });
rangeMap.splice(5, 0, { count: 5, size: 3 });
rangeMap.splice(0, 0, one, one, one, one, one,
one, one, one, one, one,
two, two, two, two, two,
two, two, two, two, two);
rangeMap.splice(5, 0, three, three, three, three, three);
assert.equal(rangeMap.count, 25);
assert.equal(rangeMap.size, 45);
......@@ -261,7 +277,7 @@ suite('RangeMap', () => {
});
test('simple', () => {
rangeMap.splice(0, 0, { count: 1, size: 1 });
rangeMap.splice(0, 0, one);
assert.equal(rangeMap.indexAt(0), 0);
assert.equal(rangeMap.indexAt(1), -1);
assert.equal(rangeMap.positionAt(0), 0);
......@@ -269,7 +285,7 @@ suite('RangeMap', () => {
});
test('simple #2', () => {
rangeMap.splice(0, 0, { count: 1, size: 10 });
rangeMap.splice(0, 0, ten);
assert.equal(rangeMap.indexAt(0), 0);
assert.equal(rangeMap.indexAt(5), 0);
assert.equal(rangeMap.indexAt(9), 0);
......@@ -279,14 +295,14 @@ suite('RangeMap', () => {
});
test('insert', () => {
rangeMap.splice(0, 0, { count: 10, size: 1 });
rangeMap.splice(0, 0, one, one, one, one, one, one, one, one, one, one);
assert.equal(rangeMap.indexAt(0), 0);
assert.equal(rangeMap.indexAt(1), 1);
assert.equal(rangeMap.indexAt(5), 5);
assert.equal(rangeMap.indexAt(9), 9);
assert.equal(rangeMap.indexAt(10), -1);
rangeMap.splice(10, 0, { count: 10, size: 1 });
rangeMap.splice(10, 0, one, one, one, one, one, one, one, one, one, one);
assert.equal(rangeMap.indexAt(10), 10);
assert.equal(rangeMap.indexAt(19), 19);
assert.equal(rangeMap.indexAt(20), -1);
......@@ -297,7 +313,7 @@ suite('RangeMap', () => {
});
test('delete', () => {
rangeMap.splice(0, 0, { count: 10, size: 1 });
rangeMap.splice(0, 0, one, one, one, one, one, one, one, one, one, one);
rangeMap.splice(2, 6);
assert.equal(rangeMap.indexAt(0), 0);
......@@ -311,7 +327,7 @@ suite('RangeMap', () => {
});
test('delete #2', () => {
rangeMap.splice(0, 0, { count: 10, size: 10 });
rangeMap.splice(0, 0, ten, ten, ten, ten, ten, ten, ten, ten, ten, ten);
rangeMap.splice(2, 6);
assert.equal(rangeMap.indexAt(0), 0);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册