feat: allow comparison with value of different type

pull/3428/head
Arman Ozak 6 years ago
parent 678e930e34
commit 9a4804e56e

@ -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>,

Loading…
Cancel
Save