Skip to content

Commit 3f47356

Browse files
committed
debt - LinkedList#_remove should not check for double remove
1 parent 73125fd commit 3f47356

2 files changed

Lines changed: 39 additions & 33 deletions

File tree

src/vs/base/common/linkedList.ts

Lines changed: 31 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,15 @@ export class LinkedList<E> {
6969
oldFirst.prev = newNode;
7070
}
7171
this._size += 1;
72-
return this._remove.bind(this, newNode);
73-
}
7472

73+
let didRemove = false;
74+
return () => {
75+
if (!didRemove) {
76+
didRemove = true;
77+
this._remove(newNode);
78+
}
79+
};
80+
}
7581

7682
shift(): E | undefined {
7783
if (this._first === Node.Undefined) {
@@ -94,38 +100,30 @@ export class LinkedList<E> {
94100
}
95101

96102
private _remove(node: Node<E>): void {
97-
let candidate: Node<E> = this._first;
98-
while (candidate !== Node.Undefined) {
99-
if (candidate !== node) {
100-
candidate = candidate.next;
101-
continue;
102-
}
103-
if (candidate.prev !== Node.Undefined && candidate.next !== Node.Undefined) {
104-
// middle
105-
const anchor = candidate.prev;
106-
anchor.next = candidate.next;
107-
candidate.next.prev = anchor;
108-
109-
} else if (candidate.prev === Node.Undefined && candidate.next === Node.Undefined) {
110-
// only node
111-
this._first = Node.Undefined;
112-
this._last = Node.Undefined;
113-
114-
} else if (candidate.next === Node.Undefined) {
115-
// last
116-
this._last = this._last!.prev!;
117-
this._last.next = Node.Undefined;
118-
119-
} else if (candidate.prev === Node.Undefined) {
120-
// first
121-
this._first = this._first!.next!;
122-
this._first.prev = Node.Undefined;
123-
}
124-
125-
// done
126-
this._size -= 1;
127-
break;
103+
if (node.prev !== Node.Undefined && node.next !== Node.Undefined) {
104+
// middle
105+
const anchor = node.prev;
106+
anchor.next = node.next;
107+
node.next.prev = anchor;
108+
109+
} else if (node.prev === Node.Undefined && node.next === Node.Undefined) {
110+
// only node
111+
this._first = Node.Undefined;
112+
this._last = Node.Undefined;
113+
114+
} else if (node.next === Node.Undefined) {
115+
// last
116+
this._last = this._last!.prev!;
117+
this._last.next = Node.Undefined;
118+
119+
} else if (node.prev === Node.Undefined) {
120+
// first
121+
this._first = this._first!.next!;
122+
this._first.prev = Node.Undefined;
128123
}
124+
125+
// done
126+
this._size -= 1;
129127
}
130128

131129
iterator(): Iterator<E> {

src/vs/base/test/common/linkedList.test.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ suite('LinkedList', function () {
5252
disp = list.push(2);
5353
disp();
5454
assertElements(list, 0, 1);
55+
56+
list = new LinkedList<number>();
57+
list.push(0);
58+
list.push(1);
59+
disp = list.push(2);
60+
disp();
61+
disp();
62+
assertElements(list, 0, 1);
5563
});
5664

5765
test('Push/toArray', () => {

0 commit comments

Comments
 (0)