|
|
|
@ -85,10 +85,10 @@ export class LinkedList<T = any> { |
|
|
|
|
|
|
|
add(value: T) { |
|
|
|
return { |
|
|
|
after: (previousValue: T, compareFn: ListComparisonFn<T> = compare) => |
|
|
|
this.addAfter(value, previousValue, compareFn), |
|
|
|
before: (nextValue: T, compareFn: ListComparisonFn<T> = compare) => |
|
|
|
this.addBefore(value, nextValue, compareFn), |
|
|
|
after: (...params: [T] | [any, ListComparisonFn<T>]) => |
|
|
|
this.addAfter.call(this, value, ...params), |
|
|
|
before: (...params: [T] | [any, ListComparisonFn<T>]) => |
|
|
|
this.addBefore.call(this, value, ...params), |
|
|
|
byIndex: (position: number) => this.addByIndex(value, position), |
|
|
|
head: () => this.addHead(value), |
|
|
|
tail: () => this.addTail(value), |
|
|
|
@ -97,23 +97,27 @@ export class LinkedList<T = any> { |
|
|
|
|
|
|
|
addMany(values: T[]) { |
|
|
|
return { |
|
|
|
after: (previousValue: T, compareFn: ListComparisonFn<T> = compare) => |
|
|
|
this.addManyAfter(values, previousValue, compareFn), |
|
|
|
before: (nextValue: T, compareFn: ListComparisonFn<T> = compare) => |
|
|
|
this.addManyBefore(values, nextValue, compareFn), |
|
|
|
after: (...params: [T] | [any, ListComparisonFn<T>]) => |
|
|
|
this.addManyAfter.call(this, values, ...params), |
|
|
|
before: (...params: [T] | [any, ListComparisonFn<T>]) => |
|
|
|
this.addManyBefore.call(this, values, ...params), |
|
|
|
byIndex: (position: number) => this.addManyByIndex(values, position), |
|
|
|
head: () => this.addManyHead(values), |
|
|
|
tail: () => this.addManyTail(values), |
|
|
|
}; |
|
|
|
} |
|
|
|
|
|
|
|
addAfter(value: T, previousValue: T, compareFn: ListComparisonFn<T> = compare): ListNode<T> { |
|
|
|
addAfter(value: T, nextValue: T): ListNode<T>; |
|
|
|
addAfter(value: T, previousValue: any, compareFn: ListComparisonFn<T>): ListNode<T>; |
|
|
|
addAfter(value: T, previousValue: any, compareFn: ListComparisonFn<T> = compare): ListNode<T> { |
|
|
|
const previous = this.find(node => compareFn(node.value, previousValue)); |
|
|
|
|
|
|
|
return previous ? this.attach(value, previous, previous.next) : this.addTail(value); |
|
|
|
} |
|
|
|
|
|
|
|
addBefore(value: T, nextValue: T, compareFn: ListComparisonFn<T> = compare): ListNode<T> { |
|
|
|
addBefore(value: T, nextValue: T): ListNode<T>; |
|
|
|
addBefore(value: T, nextValue: any, compareFn: ListComparisonFn<T>): ListNode<T>; |
|
|
|
addBefore(value: T, nextValue: any, compareFn: ListComparisonFn<T> = compare): ListNode<T> { |
|
|
|
const next = this.find(node => compareFn(node.value, nextValue)); |
|
|
|
|
|
|
|
return next ? this.attach(value, next.previous, next) : this.addHead(value); |
|
|
|
@ -161,9 +165,11 @@ export class LinkedList<T = any> { |
|
|
|
return node; |
|
|
|
} |
|
|
|
|
|
|
|
addManyAfter(values: T[], previousValue: T): ListNode<T>[]; |
|
|
|
addManyAfter(values: T[], previousValue: any, compareFn: ListComparisonFn<T>): ListNode<T>[]; |
|
|
|
addManyAfter( |
|
|
|
values: T[], |
|
|
|
previousValue: T, |
|
|
|
previousValue: any, |
|
|
|
compareFn: ListComparisonFn<T> = compare, |
|
|
|
): ListNode<T>[] { |
|
|
|
const previous = this.find(node => compareFn(node.value, previousValue)); |
|
|
|
@ -171,9 +177,11 @@ export class LinkedList<T = any> { |
|
|
|
return previous ? this.attachMany(values, previous, previous.next) : this.addManyTail(values); |
|
|
|
} |
|
|
|
|
|
|
|
addManyBefore(values: T[], previousValue: T): ListNode<T>[]; |
|
|
|
addManyBefore(values: T[], nextValue: any, compareFn: ListComparisonFn<T>): ListNode<T>[]; |
|
|
|
addManyBefore( |
|
|
|
values: T[], |
|
|
|
nextValue: T, |
|
|
|
nextValue: any, |
|
|
|
compareFn: ListComparisonFn<T> = compare, |
|
|
|
): ListNode<T>[] { |
|
|
|
const next = this.find(node => compareFn(node.value, nextValue)); |
|
|
|
@ -207,10 +215,10 @@ export class LinkedList<T = any> { |
|
|
|
drop() { |
|
|
|
return { |
|
|
|
byIndex: (position: number) => this.dropByIndex(position), |
|
|
|
byValue: (value: T, compareFn: ListComparisonFn<T> = compare) => |
|
|
|
this.dropByValue(value, compareFn), |
|
|
|
byValueAll: (value: T, compareFn: ListComparisonFn<T> = compare) => |
|
|
|
this.dropByValueAll(value, compareFn), |
|
|
|
byValue: (...params: [T] | [any, ListComparisonFn<T>]) => |
|
|
|
this.dropByValue.apply(this, params), |
|
|
|
byValueAll: (...params: [T] | [any, ListComparisonFn<T>]) => |
|
|
|
this.dropByValueAll.apply(this, params), |
|
|
|
head: () => this.dropHead(), |
|
|
|
tail: () => this.dropTail(), |
|
|
|
}; |
|
|
|
@ -232,13 +240,17 @@ export class LinkedList<T = any> { |
|
|
|
return current ? this.detach(current) : undefined; |
|
|
|
} |
|
|
|
|
|
|
|
dropByValue(value: T, compareFn: ListComparisonFn<T> = compare): ListNode<T> | undefined { |
|
|
|
dropByValue(value: T): ListNode<T> | undefined; |
|
|
|
dropByValue(value: any, compareFn: ListComparisonFn<T>): ListNode<T> | undefined; |
|
|
|
dropByValue(value: any, compareFn: ListComparisonFn<T> = compare): ListNode<T> | undefined { |
|
|
|
const position = this.findIndex(node => compareFn(node.value, value)); |
|
|
|
|
|
|
|
return position < 0 ? undefined : this.dropByIndex(position); |
|
|
|
} |
|
|
|
|
|
|
|
dropByValueAll(value: T, compareFn: ListComparisonFn<T> = compare): ListNode<T>[] { |
|
|
|
dropByValueAll(value: T): ListNode<T>[]; |
|
|
|
dropByValueAll(value: any, compareFn: ListComparisonFn<T>): ListNode<T>[]; |
|
|
|
dropByValueAll(value: any, compareFn: ListComparisonFn<T> = compare): ListNode<T>[] { |
|
|
|
const dropped: ListNode<T>[] = []; |
|
|
|
|
|
|
|
for (let current = this.first, position = 0; current; position++, current = current.next) { |
|
|
|
@ -352,7 +364,9 @@ export class LinkedList<T = any> { |
|
|
|
return this.find((_, index) => position === index); |
|
|
|
} |
|
|
|
|
|
|
|
indexOf(value: T, compareFn: ListComparisonFn<T> = compare): number { |
|
|
|
indexOf(value: T): number; |
|
|
|
indexOf(value: any, compareFn: ListComparisonFn<T>): number; |
|
|
|
indexOf(value: any, compareFn: ListComparisonFn<T> = compare): number { |
|
|
|
return this.findIndex(node => compareFn(node.value, value)); |
|
|
|
} |
|
|
|
|
|
|
|
@ -378,6 +392,7 @@ export class LinkedList<T = any> { |
|
|
|
.join(' <-> '); |
|
|
|
} |
|
|
|
|
|
|
|
// Cannot use Generator type because of ng-packagr
|
|
|
|
*[Symbol.iterator](): any { |
|
|
|
for (let node = this.first, position = 0; node; position++, node = node.next) { |
|
|
|
yield node.value; |
|
|
|
@ -387,7 +402,7 @@ export class LinkedList<T = any> { |
|
|
|
|
|
|
|
export type ListMapperFn<T = any> = (value: T) => any; |
|
|
|
|
|
|
|
export type ListComparisonFn<T = any> = (value1: T, value2: T) => boolean; |
|
|
|
export type ListComparisonFn<T = any> = (value1: T, value2: any) => boolean; |
|
|
|
|
|
|
|
export type ListIteratorFn<T = any, R = boolean> = ( |
|
|
|
node: ListNode<T>, |
|
|
|
|