Comparing version 1.0.6 to 1.1.0
@@ -95,2 +95,38 @@ "use strict"; | ||
}; | ||
this.insertAfterNode = (node, item) => { | ||
if (node.list !== this) { | ||
return undefined; // Nothing to do -- wrong list | ||
} | ||
const newNode = new DoubleLinkedListNode(this, item); | ||
if (node.list.lastNode === node) { | ||
this.lastNode = newNode; | ||
} | ||
newNode.previousNode = node; | ||
if (node.nextNode !== undefined) { | ||
newNode.nextNode = node.nextNode; | ||
node.nextNode.previousNode = newNode; | ||
} | ||
node.nextNode = newNode; | ||
this.allValues = undefined; | ||
this.length += 1; | ||
return newNode; | ||
}; | ||
this.insertBeforeNode = (node, item) => { | ||
if (node.list !== this) { | ||
return undefined; // Nothing to do -- wrong list | ||
} | ||
const newNode = new DoubleLinkedListNode(this, item); | ||
if (node.list.firstNode === node) { | ||
this.firstNode = newNode; | ||
} | ||
newNode.nextNode = node; | ||
if (node.previousNode !== undefined) { | ||
newNode.previousNode = node.previousNode; | ||
node.previousNode.nextNode = newNode; | ||
} | ||
node.previousNode = newNode; | ||
this.allValues = undefined; | ||
this.length += 1; | ||
return newNode; | ||
}; | ||
for (const item of items) { | ||
@@ -97,0 +133,0 @@ this.append(item); |
@@ -17,2 +17,4 @@ export declare class DoubleLinkedList<ItemT> { | ||
readonly remove: (node: DoubleLinkedListNode<ItemT>) => boolean; | ||
readonly insertAfterNode: (node: DoubleLinkedListNode<ItemT>, item: ItemT) => Readonly<DoubleLinkedListNode<ItemT>> | undefined; | ||
readonly insertBeforeNode: (node: DoubleLinkedListNode<ItemT>, item: ItemT) => Readonly<DoubleLinkedListNode<ItemT>> | undefined; | ||
} | ||
@@ -19,0 +21,0 @@ export declare class DoubleLinkedListNode<ItemT> { |
{ | ||
"name": "doublell", | ||
"version": "1.0.6", | ||
"version": "1.1.0", | ||
"description": "A very minimal double linked list", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
@@ -18,9 +18,11 @@ # doublell | ||
const node1 = list.append(1); | ||
const node2 = list.prepend(2); | ||
const node0 = list.prepend(0); | ||
const node0_5 = list.insertBeforeNode(node1, 0.5); | ||
const node1_5 = list.insertAfterNode(node1, 1.5); | ||
console.log(list.getLength()); | ||
console.log(list.getHead()?.value); | ||
console.log(list.getTail()?.value); | ||
console.log(node2.nextNode?.value); | ||
console.log(node0.nextNode?.value); | ||
console.log(node1.previousNode?.value); | ||
list.remove(node2); | ||
list.remove(node0); | ||
list.clear(); | ||
@@ -27,0 +29,0 @@ ``` |
@@ -55,2 +55,86 @@ import { DoubleLinkedList } from '../index.js'; | ||
it('insertAfterNode should work', () => { | ||
const list = new DoubleLinkedList<number>(); | ||
const node1 = list.append(1); | ||
const node2 = list.append(2); | ||
const node3 = list.append(3); | ||
const node2_5 = list.insertAfterNode(node2, 2.5); | ||
expect(list.getLength()).toEqual(4); | ||
expect(list.getHead()).toBe(node1); | ||
expect(list.getTail()).toBe(node3); | ||
expect(node1.previousNode).toBeUndefined(); | ||
expect(node2.previousNode).toBe(node1); | ||
expect(node2_5?.previousNode).toBe(node2); | ||
expect(node3.previousNode).toBe(node2_5); | ||
expect(node1.nextNode).toBe(node2); | ||
expect(node2.nextNode).toBe(node2_5); | ||
expect(node2_5?.nextNode).toBe(node3); | ||
expect(node3.nextNode).toBeUndefined(); | ||
const node1_5 = list.insertAfterNode(node1, 1.5); | ||
expect(list.getLength()).toEqual(5); | ||
expect(list.getHead()).toBe(node1); | ||
expect(list.getTail()).toBe(node3); | ||
expect(node1.previousNode).toBeUndefined(); | ||
expect(node1_5?.previousNode).toBe(node1); | ||
expect(node2.previousNode).toBe(node1_5); | ||
expect(node1.nextNode).toBe(node1_5); | ||
expect(node1_5?.nextNode).toBe(node2); | ||
expect(node2.nextNode).toBe(node2_5); | ||
const node3_5 = list.insertAfterNode(node3, 3.5); | ||
expect(list.getLength()).toEqual(6); | ||
expect(list.getHead()).toBe(node1); | ||
expect(list.getTail()).toBe(node3_5); | ||
expect(node2_5?.previousNode).toBe(node2); | ||
expect(node3.previousNode).toBe(node2_5); | ||
expect(node3_5?.previousNode).toBe(node3); | ||
expect(node2_5?.nextNode).toBe(node3); | ||
expect(node3.nextNode).toBe(node3_5); | ||
expect(node3_5?.nextNode).toBeUndefined(); | ||
}); | ||
it('insertBeforeNode should work', () => { | ||
const list = new DoubleLinkedList<number>(); | ||
const node1 = list.append(1); | ||
const node2 = list.append(2); | ||
const node3 = list.append(3); | ||
const node1_5 = list.insertBeforeNode(node2, 1.5); | ||
expect(list.getLength()).toEqual(4); | ||
expect(list.getHead()).toBe(node1); | ||
expect(list.getTail()).toBe(node3); | ||
expect(node1.previousNode).toBeUndefined(); | ||
expect(node1_5?.previousNode).toBe(node1); | ||
expect(node2.previousNode).toBe(node1_5); | ||
expect(node3.previousNode).toBe(node2); | ||
expect(node1.nextNode).toBe(node1_5); | ||
expect(node1_5?.nextNode).toBe(node2); | ||
expect(node2.nextNode).toBe(node3); | ||
expect(node3.nextNode).toBeUndefined(); | ||
const node0_5 = list.insertBeforeNode(node1, 0.5); | ||
expect(list.getLength()).toEqual(5); | ||
expect(list.getHead()).toBe(node0_5); | ||
expect(list.getTail()).toBe(node3); | ||
expect(node0_5?.previousNode).toBeUndefined(); | ||
expect(node1.previousNode).toBe(node0_5); | ||
expect(node1_5?.previousNode).toBe(node1); | ||
expect(node2.previousNode).toBe(node1_5); | ||
expect(node0_5?.nextNode).toBe(node1); | ||
expect(node1.nextNode).toBe(node1_5); | ||
expect(node1_5?.nextNode).toBe(node2); | ||
expect(node2.nextNode).toBe(node3); | ||
const node2_5 = list.insertBeforeNode(node3, 2.5); | ||
expect(list.getLength()).toEqual(6); | ||
expect(list.getHead()).toBe(node0_5); | ||
expect(list.getTail()).toBe(node3); | ||
expect(node2.previousNode).toBe(node1_5); | ||
expect(node2_5?.previousNode).toBe(node2); | ||
expect(node3.previousNode).toBe(node2_5); | ||
expect(node2.nextNode).toBe(node2_5); | ||
expect(node2_5?.nextNode).toBe(node3); | ||
expect(node3.nextNode).toBeUndefined(); | ||
}); | ||
it('remove head should work', () => { | ||
@@ -57,0 +141,0 @@ const list = new DoubleLinkedList<number>(); |
@@ -119,2 +119,57 @@ export class DoubleLinkedList<ItemT> { | ||
}; | ||
public readonly insertAfterNode = (node: DoubleLinkedListNode<ItemT>, item: ItemT): Readonly<DoubleLinkedListNode<ItemT>> | undefined => { | ||
if (node.list !== this) { | ||
return undefined; // Nothing to do -- wrong list | ||
} | ||
const newNode = new DoubleLinkedListNode<ItemT>(this, item); | ||
if (node.list.lastNode === node) { | ||
this.lastNode = newNode; | ||
} | ||
newNode.previousNode = node; | ||
if (node.nextNode !== undefined) { | ||
newNode.nextNode = node.nextNode; | ||
node.nextNode.previousNode = newNode; | ||
} | ||
node.nextNode = newNode; | ||
this.allValues = undefined; | ||
this.length += 1; | ||
return newNode; | ||
}; | ||
public readonly insertBeforeNode = ( | ||
node: DoubleLinkedListNode<ItemT>, | ||
item: ItemT | ||
): Readonly<DoubleLinkedListNode<ItemT>> | undefined => { | ||
if (node.list !== this) { | ||
return undefined; // Nothing to do -- wrong list | ||
} | ||
const newNode = new DoubleLinkedListNode<ItemT>(this, item); | ||
if (node.list.firstNode === node) { | ||
this.firstNode = newNode; | ||
} | ||
newNode.nextNode = node; | ||
if (node.previousNode !== undefined) { | ||
newNode.previousNode = node.previousNode; | ||
node.previousNode.nextNode = newNode; | ||
} | ||
node.previousNode = newNode; | ||
this.allValues = undefined; | ||
this.length += 1; | ||
return newNode; | ||
}; | ||
} | ||
@@ -121,0 +176,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
44157
691
47