diff --git a/npm/packs/utils/projects/utils/src/lib/linked-list.ts b/npm/packs/utils/projects/utils/src/lib/linked-list.ts index c0f014121a..f0b50836ce 100644 --- a/npm/packs/utils/projects/utils/src/lib/linked-list.ts +++ b/npm/packs/utils/projects/utils/src/lib/linked-list.ts @@ -85,10 +85,10 @@ export class LinkedList { add(value: T) { return { - after: (previousValue: T, compareFn: ListComparisonFn = compare) => - this.addAfter(value, previousValue, compareFn), - before: (nextValue: T, compareFn: ListComparisonFn = compare) => - this.addBefore(value, nextValue, compareFn), + after: (...params: [T] | [any, ListComparisonFn]) => + this.addAfter.call(this, value, ...params), + before: (...params: [T] | [any, ListComparisonFn]) => + 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 { addMany(values: T[]) { return { - after: (previousValue: T, compareFn: ListComparisonFn = compare) => - this.addManyAfter(values, previousValue, compareFn), - before: (nextValue: T, compareFn: ListComparisonFn = compare) => - this.addManyBefore(values, nextValue, compareFn), + after: (...params: [T] | [any, ListComparisonFn]) => + this.addManyAfter.call(this, values, ...params), + before: (...params: [T] | [any, ListComparisonFn]) => + 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 = compare): ListNode { + addAfter(value: T, nextValue: T): ListNode; + addAfter(value: T, previousValue: any, compareFn: ListComparisonFn): ListNode; + addAfter(value: T, previousValue: any, compareFn: ListComparisonFn = compare): ListNode { 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 = compare): ListNode { + addBefore(value: T, nextValue: T): ListNode; + addBefore(value: T, nextValue: any, compareFn: ListComparisonFn): ListNode; + addBefore(value: T, nextValue: any, compareFn: ListComparisonFn = compare): ListNode { 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 { return node; } + addManyAfter(values: T[], previousValue: T): ListNode[]; + addManyAfter(values: T[], previousValue: any, compareFn: ListComparisonFn): ListNode[]; addManyAfter( values: T[], - previousValue: T, + previousValue: any, compareFn: ListComparisonFn = compare, ): ListNode[] { const previous = this.find(node => compareFn(node.value, previousValue)); @@ -171,9 +177,11 @@ export class LinkedList { return previous ? this.attachMany(values, previous, previous.next) : this.addManyTail(values); } + addManyBefore(values: T[], previousValue: T): ListNode[]; + addManyBefore(values: T[], nextValue: any, compareFn: ListComparisonFn): ListNode[]; addManyBefore( values: T[], - nextValue: T, + nextValue: any, compareFn: ListComparisonFn = compare, ): ListNode[] { const next = this.find(node => compareFn(node.value, nextValue)); @@ -207,10 +215,10 @@ export class LinkedList { drop() { return { byIndex: (position: number) => this.dropByIndex(position), - byValue: (value: T, compareFn: ListComparisonFn = compare) => - this.dropByValue(value, compareFn), - byValueAll: (value: T, compareFn: ListComparisonFn = compare) => - this.dropByValueAll(value, compareFn), + byValue: (...params: [T] | [any, ListComparisonFn]) => + this.dropByValue.apply(this, params), + byValueAll: (...params: [T] | [any, ListComparisonFn]) => + this.dropByValueAll.apply(this, params), head: () => this.dropHead(), tail: () => this.dropTail(), }; @@ -232,13 +240,17 @@ export class LinkedList { return current ? this.detach(current) : undefined; } - dropByValue(value: T, compareFn: ListComparisonFn = compare): ListNode | undefined { + dropByValue(value: T): ListNode | undefined; + dropByValue(value: any, compareFn: ListComparisonFn): ListNode | undefined; + dropByValue(value: any, compareFn: ListComparisonFn = compare): ListNode | undefined { const position = this.findIndex(node => compareFn(node.value, value)); return position < 0 ? undefined : this.dropByIndex(position); } - dropByValueAll(value: T, compareFn: ListComparisonFn = compare): ListNode[] { + dropByValueAll(value: T): ListNode[]; + dropByValueAll(value: any, compareFn: ListComparisonFn): ListNode[]; + dropByValueAll(value: any, compareFn: ListComparisonFn = compare): ListNode[] { const dropped: ListNode[] = []; for (let current = this.first, position = 0; current; position++, current = current.next) { @@ -352,7 +364,9 @@ export class LinkedList { return this.find((_, index) => position === index); } - indexOf(value: T, compareFn: ListComparisonFn = compare): number { + indexOf(value: T): number; + indexOf(value: any, compareFn: ListComparisonFn): number; + indexOf(value: any, compareFn: ListComparisonFn = compare): number { return this.findIndex(node => compareFn(node.value, value)); } @@ -378,6 +392,7 @@ export class LinkedList { .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 { export type ListMapperFn = (value: T) => any; -export type ListComparisonFn = (value1: T, value2: T) => boolean; +export type ListComparisonFn = (value1: T, value2: any) => boolean; export type ListIteratorFn = ( node: ListNode,