undirected-graph-typed 1.53.3 → 1.53.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -353,8 +353,8 @@ export class DoublyLinkedListNode<E = any> {
353
353
  * cache.set('c', 3);
354
354
  * cache.set('d', 4); // This will eliminate 'a'
355
355
  *
356
- * console.log(cache.get('a')).toBeUndefined();
357
- * expect(cache.get('b')); // 2
356
+ * console.log(cache.get('a')); // undefined
357
+ * console.log(cache.get('b')); // 2
358
358
  * console.log(cache.get('c')); // 3
359
359
  * console.log(cache.get('d')); // 4
360
360
  *
@@ -368,8 +368,8 @@ export class DoublyLinkedListNode<E = any> {
368
368
  * cache.set('d', 4); // This will eliminate 'b'
369
369
  *
370
370
  * console.log(cache.get('a')); // 1
371
- * console.log(cache.get('b')).toBeUndefined();
372
- * expect(cache.get('c')); // 3
371
+ * console.log(cache.get('b')); // undefined
372
+ * console.log(cache.get('c')); // 3
373
373
  * console.log(cache.get('d')); // 4
374
374
  *
375
375
  * // Should support updating existing keys
@@ -385,8 +385,8 @@ export class DoublyLinkedListNode<E = any> {
385
385
  * cache.set('b', 2);
386
386
  *
387
387
  * console.log(cache.delete('a')); // true
388
- * console.log(cache.get('a')).toBeUndefined();
389
- * expect(cache.size); // 1
388
+ * console.log(cache.get('a')); // undefined
389
+ * console.log(cache.size); // 1
390
390
  *
391
391
  * // Should support clearing cache
392
392
  * cache.clear();
@@ -422,20 +422,20 @@ export class DoublyLinkedListNode<E = any> {
422
422
  * // Test different scenarios of lyric synchronization
423
423
  *
424
424
  * // 1. Find lyric at exact timestamp
425
- * const exactTimeLyric = lyricsList.findBackward(lyric => lyric.time <= 36000);
425
+ * const exactTimeLyric = lyricsList.getBackward(lyric => lyric.value.time <= 36000);
426
426
  * console.log(exactTimeLyric?.text); // 'And ignite your bones'
427
427
  *
428
428
  * // 2. Find lyric between timestamps
429
- * const betweenTimeLyric = lyricsList.findBackward(lyric => lyric.time <= 22000);
429
+ * const betweenTimeLyric = lyricsList.getBackward(lyric => lyric.value.time <= 22000);
430
430
  * console.log(betweenTimeLyric?.text); // "When you lose something you can't replace"
431
431
  *
432
432
  * // 3. Find first lyric when timestamp is less than first entry
433
- * const earlyTimeLyric = lyricsList.findBackward(lyric => lyric.time <= -1000);
434
- * console.log(earlyTimeLyric).toBeUndefined();
433
+ * const earlyTimeLyric = lyricsList.getBackward(lyric => lyric.value.time <= -1000);
434
+ * console.log(earlyTimeLyric); // undefined
435
435
  *
436
436
  * // 4. Find last lyric when timestamp is after last entry
437
- * const lateTimeLyric = lyricsList.findBackward(lyric => lyric.time <= 50000);
438
- * expect(lateTimeLyric?.text); // 'And I will try to fix you'
437
+ * const lateTimeLyric = lyricsList.getBackward(lyric => lyric.value.time <= 50000);
438
+ * console.log(lateTimeLyric?.text); // 'And I will try to fix you'
439
439
  * @example
440
440
  * // cpu process schedules
441
441
  * class Process {
@@ -582,29 +582,36 @@ export class DoublyLinkedList<E = any, R = any> extends IterableElementBase<E, R
582
582
  }
583
583
 
584
584
  /**
585
- * Time Complexity: O(n)
586
- * Space Complexity: O(n)
585
+ * Time Complexity: O(1)
586
+ * Space Complexity: O(1)
587
587
  *
588
- * The `fromArray` function creates a new instance of a DoublyLinkedList and populates it with the elements from the
589
- * given array.
590
- * @param {E[]} data - The `data` parameter is an array of elements of type `E`.
591
- * @returns The `fromArray` function returns a DoublyLinkedList object.
588
+ * The function `isNode` in TypeScript checks if a given input is an instance of
589
+ * `DoublyLinkedListNode`.
590
+ * @param {E | DoublyLinkedListNode<E> | ((node: DoublyLinkedListNode<E>) => boolean)} elementNodeOrPredicate
591
+ * elementNodeOrPredicate - The `elementNodeOrPredicate` parameter in the `isNode` function can
592
+ * be one of the following types:
593
+ * @returns The `isNode` function is checking if the `elementNodeOrPredicate` parameter is an
594
+ * instance of `DoublyLinkedListNode<E>`. If it is, the function returns `true`, indicating that the
595
+ * parameter is a `DoublyLinkedListNode<E>`. If it is not an instance of `DoublyLinkedListNode<E>`,
596
+ * the function returns `false`.
592
597
  */
593
- static fromArray<E>(data: E[]) {
594
- return new DoublyLinkedList<E>(data);
598
+ isNode(
599
+ elementNodeOrPredicate: E | DoublyLinkedListNode<E> | ((node: DoublyLinkedListNode<E>) => boolean)
600
+ ): elementNodeOrPredicate is DoublyLinkedListNode<E> {
601
+ return elementNodeOrPredicate instanceof DoublyLinkedListNode;
595
602
  }
596
603
 
597
604
  /**
598
605
  * Time Complexity: O(1)
599
606
  * Space Complexity: O(1)
600
607
  *
601
- * The push function adds a new element to the end of a doubly linked list.
602
- * @param {E} element - The "element" parameter represents the value that you want to add to the
603
- * doubly linked list.
604
- * @returns The `push` method is returning a boolean value, `true`.
608
+ * The `push` function adds a new element or node to the end of a doubly linked list.
609
+ * @param {E | DoublyLinkedListNode<E>} elementOrNode - The `elementOrNode` parameter in the `push`
610
+ * method can accept either an element of type `E` or a `DoublyLinkedListNode<E>` object.
611
+ * @returns The `push` method is returning a boolean value, specifically `true`.
605
612
  */
606
- push(element: E): boolean {
607
- const newNode = new DoublyLinkedListNode(element);
613
+ push(elementOrNode: E | DoublyLinkedListNode<E>): boolean {
614
+ const newNode = this._ensureNode(elementOrNode);
608
615
  if (!this.head) {
609
616
  this._head = newNode;
610
617
  this._tail = newNode;
@@ -663,13 +670,14 @@ export class DoublyLinkedList<E = any, R = any> extends IterableElementBase<E, R
663
670
  * Time Complexity: O(1)
664
671
  * Space Complexity: O(1)
665
672
  *
666
- * The unshift function adds a new element to the beginning of a doubly linked list.
667
- * @param {E} element - The "element" parameter represents the value of the element that you want to
668
- * add to the beginning of the doubly linked list.
669
- * @returns The `unshift` method is returning a boolean value, `true`.
673
+ * The unshift function adds a new element or node to the beginning of a doubly linked list.
674
+ * @param {E | DoublyLinkedListNode<E>} elementOrNode - The `elementOrNode` parameter in the
675
+ * `unshift` method can be either an element of type `E` or a `DoublyLinkedListNode` containing an
676
+ * element of type `E`.
677
+ * @returns The `unshift` method is returning a boolean value, specifically `true`.
670
678
  */
671
- unshift(element: E): boolean {
672
- const newNode = new DoublyLinkedListNode(element);
679
+ unshift(elementOrNode: E | DoublyLinkedListNode<E>): boolean {
680
+ const newNode = this._ensureNode(elementOrNode);
673
681
  if (!this.head) {
674
682
  this._head = newNode;
675
683
  this._tail = newNode;
@@ -725,17 +733,29 @@ export class DoublyLinkedList<E = any, R = any> extends IterableElementBase<E, R
725
733
  * Time Complexity: O(n)
726
734
  * Space Complexity: O(1)
727
735
  *
728
- * The function `findNodeByValue` searches for a node with a specific value in a doubly linked list and returns the
729
- * node if found, otherwise it returns undefined.
730
- * @param {E} value - The `value` parameter is the value that we want to search for in the doubly linked list.
731
- * @returns The function `findNodeByValue` returns a `DoublyLinkedListNode<E>` if a node with the specified value `value`
732
- * is found in the linked list. If no such node is found, it returns `undefined`.
736
+ * This TypeScript function searches for a node in a doubly linked list based on a given element node
737
+ * or predicate.
738
+ * @param {| E
739
+ * | DoublyLinkedListNode<E>
740
+ * | ((node: DoublyLinkedListNode<E>) => boolean)
741
+ * | undefined} elementNodeOrPredicate - The `getNode` method you provided is used to find a
742
+ * node in a doubly linked list based on a given element, node, or predicate function. The
743
+ * `elementNodeOrPredicate` parameter can be one of the following:
744
+ * @returns The `getNode` method returns a `DoublyLinkedListNode<E>` or `undefined` based on the
745
+ * input `elementNodeOrPredicate`. If the input is `undefined`, the method returns `undefined`.
746
+ * Otherwise, it iterates through the linked list starting from the head node and applies the
747
+ * provided predicate function to each node. If a node satisfies the predicate, that node is
748
+ * returned. If
733
749
  */
734
- getNode(value: E | undefined): DoublyLinkedListNode<E> | undefined {
750
+ getNode(
751
+ elementNodeOrPredicate: E | DoublyLinkedListNode<E> | ((node: DoublyLinkedListNode<E>) => boolean) | undefined
752
+ ): DoublyLinkedListNode<E> | undefined {
753
+ if (elementNodeOrPredicate === undefined) return;
754
+ const predicate = this._ensurePredicate(elementNodeOrPredicate);
735
755
  let current = this.head;
736
756
 
737
757
  while (current) {
738
- if (current.value === value) {
758
+ if (predicate(current)) {
739
759
  return current;
740
760
  }
741
761
  current = current.next;
@@ -748,26 +768,28 @@ export class DoublyLinkedList<E = any, R = any> extends IterableElementBase<E, R
748
768
  * Time Complexity: O(n)
749
769
  * Space Complexity: O(1)
750
770
  *
751
- * The `insert` function inserts a value at a specified index in a doubly linked list.
752
- * @param {number} index - The index parameter represents the position at which the new value should be inserted in the
753
- * DoublyLinkedList. It is of type number.
754
- * @param {E} value - The `value` parameter represents the value that you want to insert into the Doubly Linked List at the
755
- * specified index.
756
- * @returns The `insert` method returns a boolean value. It returns `true` if the insertion is successful, and `false`
757
- * if the index is out of bounds.
771
+ * The `addAt` function inserts a new element or node at a specified index in a doubly linked list.
772
+ * @param {number} index - The `index` parameter in the `addAt` method represents the position at
773
+ * which you want to add a new element or node in the doubly linked list. It indicates the location
774
+ * where the new element or node should be inserted.
775
+ * @param {E | DoublyLinkedListNode<E>} newElementOrNode - The `newElementOrNode` parameter in the
776
+ * `addAt` method can be either a value of type `E` or a `DoublyLinkedListNode<E>` object.
777
+ * @returns The `addAt` method returns a boolean value. It returns `true` if the element or node was
778
+ * successfully added at the specified index, and `false` if the index is out of bounds (less than 0
779
+ * or greater than the size of the list).
758
780
  */
759
- addAt(index: number, value: E): boolean {
781
+ addAt(index: number, newElementOrNode: E | DoublyLinkedListNode<E>): boolean {
760
782
  if (index < 0 || index > this._size) return false;
761
783
  if (index === 0) {
762
- this.unshift(value);
784
+ this.unshift(newElementOrNode);
763
785
  return true;
764
786
  }
765
787
  if (index === this._size) {
766
- this.push(value);
788
+ this.push(newElementOrNode);
767
789
  return true;
768
790
  }
769
791
 
770
- const newNode = new DoublyLinkedListNode(value);
792
+ const newNode = this._ensureNode(newElementOrNode);
771
793
  const prevNode = this.getNodeAt(index - 1);
772
794
  const nextNode = prevNode!.next;
773
795
  newNode.prev = prevNode;
@@ -782,26 +804,31 @@ export class DoublyLinkedList<E = any, R = any> extends IterableElementBase<E, R
782
804
  * Time Complexity: O(1) or O(n)
783
805
  * Space Complexity: O(1)
784
806
  *
785
- * The `addBefore` function inserts a new value before an existing value or node in a doubly linked list.
786
- * @param {E | DoublyLinkedListNode<E>} existingValueOrNode - The existing value or node in the doubly linked list
787
- * before which the new value will be inserted. It can be either the value of the existing node or the existing node
788
- * itself.
789
- * @param {E} newValue - The `newValue` parameter represents the value that you want to insert into the doubly linked
790
- * list.
791
- * @returns The method returns a boolean value. It returns `true` if the insertion is successful, and `false` if the
792
- * insertion fails.
807
+ * The `addBefore` function in TypeScript adds a new element or node before an existing element or
808
+ * node in a doubly linked list.
809
+ * @param {E | DoublyLinkedListNode<E>} existingElementOrNode - The `existingElementOrNode` parameter
810
+ * in the `addBefore` method can be either an element of type `E` or a `DoublyLinkedListNode<E>`.
811
+ * @param {E | DoublyLinkedListNode<E>} newElementOrNode - The `newElementOrNode` parameter
812
+ * represents the element or node that you want to add before the `existingElementOrNode` in a doubly
813
+ * linked list.
814
+ * @returns The `addBefore` method returns a boolean value - `true` if the new element or node was
815
+ * successfully added before the existing element or node, and `false` if the existing element or
816
+ * node was not found.
793
817
  */
794
- addBefore(existingValueOrNode: E | DoublyLinkedListNode<E>, newValue: E): boolean {
818
+ addBefore(
819
+ existingElementOrNode: E | DoublyLinkedListNode<E>,
820
+ newElementOrNode: E | DoublyLinkedListNode<E>
821
+ ): boolean {
795
822
  let existingNode;
796
823
 
797
- if (existingValueOrNode instanceof DoublyLinkedListNode) {
798
- existingNode = existingValueOrNode;
824
+ if (existingElementOrNode instanceof DoublyLinkedListNode) {
825
+ existingNode = existingElementOrNode;
799
826
  } else {
800
- existingNode = this.getNode(existingValueOrNode);
827
+ existingNode = this.getNode(existingElementOrNode);
801
828
  }
802
829
 
803
830
  if (existingNode) {
804
- const newNode = new DoublyLinkedListNode(newValue);
831
+ const newNode = this._ensureNode(newElementOrNode);
805
832
  newNode.prev = existingNode.prev;
806
833
  if (existingNode.prev) {
807
834
  existingNode.prev.next = newNode;
@@ -822,25 +849,29 @@ export class DoublyLinkedList<E = any, R = any> extends IterableElementBase<E, R
822
849
  * Time Complexity: O(1) or O(n)
823
850
  * Space Complexity: O(1)
824
851
  *
825
- * The `addAfter` function inserts a new node with a given value after an existing node in a doubly linked list.
826
- * @param {E | DoublyLinkedListNode<E>} existingValueOrNode - The existing value or node in the doubly linked list
827
- * after which the new value will be inserted. It can be either the value of the existing node or the existing node
828
- * itself.
829
- * @param {E} newValue - The value that you want to insert into the doubly linked list.
830
- * @returns The method returns a boolean value. It returns true if the insertion is successful, and false if the
831
- * existing value or node is not found in the doubly linked list.
852
+ * The `addAfter` function in TypeScript adds a new element or node after an existing element or node
853
+ * in a doubly linked list.
854
+ * @param {E | DoublyLinkedListNode<E>} existingElementOrNode - existingElementOrNode represents the
855
+ * element or node in the doubly linked list after which you want to add a new element or node.
856
+ * @param {E | DoublyLinkedListNode<E>} newElementOrNode - The `newElementOrNode` parameter in the
857
+ * `addAfter` method represents the element or node that you want to add after the existing element
858
+ * or node in a doubly linked list. This parameter can be either an element value or a
859
+ * `DoublyLinkedListNode` object that you want to insert
860
+ * @returns The `addAfter` method returns a boolean value - `true` if the new element or node was
861
+ * successfully added after the existing element or node, and `false` if the existing element or node
862
+ * was not found in the linked list.
832
863
  */
833
- addAfter(existingValueOrNode: E | DoublyLinkedListNode<E>, newValue: E): boolean {
864
+ addAfter(existingElementOrNode: E | DoublyLinkedListNode<E>, newElementOrNode: E | DoublyLinkedListNode<E>): boolean {
834
865
  let existingNode;
835
866
 
836
- if (existingValueOrNode instanceof DoublyLinkedListNode) {
837
- existingNode = existingValueOrNode;
867
+ if (existingElementOrNode instanceof DoublyLinkedListNode) {
868
+ existingNode = existingElementOrNode;
838
869
  } else {
839
- existingNode = this.getNode(existingValueOrNode);
870
+ existingNode = this.getNode(existingElementOrNode);
840
871
  }
841
872
 
842
873
  if (existingNode) {
843
- const newNode = new DoublyLinkedListNode(newValue);
874
+ const newNode = this._ensureNode(newElementOrNode);
844
875
  newNode.next = existingNode.next;
845
876
  if (existingNode.next) {
846
877
  existingNode.next.prev = newNode;
@@ -891,20 +922,17 @@ export class DoublyLinkedList<E = any, R = any> extends IterableElementBase<E, R
891
922
  * Time Complexity: O(1) or O(n)
892
923
  * Space Complexity: O(1)
893
924
  *
894
- * The `delete` function removes a node from a doubly linked list based on either the node itself or its value.
895
- * @param {E | DoublyLinkedListNode<E>} valOrNode - The `valOrNode` parameter can accept either a value of type `E` or
896
- * a `DoublyLinkedListNode<E>` object.
897
- * @returns The `delete` method returns a boolean value. It returns `true` if the value or node was successfully
898
- * deleted from the doubly linked list, and `false` if the value or node was not found in the list.
925
+ * The `delete` function removes a specified element or node from a doubly linked list if it exists.
926
+ * @param {E | DoublyLinkedListNode<E> | undefined} elementOrNode - The `elementOrNode` parameter in
927
+ * the `delete` method can accept an element of type `E`, a `DoublyLinkedListNode` of type `E`, or it
928
+ * can be `undefined`. This parameter is used to identify the node that needs to be deleted from the
929
+ * doubly linked list
930
+ * @returns The `delete` method returns a boolean value - `true` if the element or node was
931
+ * successfully deleted from the doubly linked list, and `false` if the element or node was not found
932
+ * in the list.
899
933
  */
900
- delete(valOrNode: E | DoublyLinkedListNode<E> | undefined): boolean {
901
- let node: DoublyLinkedListNode<E> | undefined;
902
-
903
- if (valOrNode instanceof DoublyLinkedListNode) {
904
- node = valOrNode;
905
- } else {
906
- node = this.getNode(valOrNode);
907
- }
934
+ delete(elementOrNode: E | DoublyLinkedListNode<E> | undefined): boolean {
935
+ const node: DoublyLinkedListNode<E> | undefined = this.getNode(elementOrNode);
908
936
 
909
937
  if (node) {
910
938
  if (node === this.head) {
@@ -950,17 +978,21 @@ export class DoublyLinkedList<E = any, R = any> extends IterableElementBase<E, R
950
978
  * Time Complexity: O(n)
951
979
  * Space Complexity: O(1)
952
980
  *
953
- * The function returns the index of the first occurrence of a given value in a linked list.
954
- * @param {E} value - The parameter `value` is of type `E`, which means it can be any data type. It represents the value
955
- * that we are searching for in the linked list.
956
- * @returns The method `indexOf` returns the index of the first occurrence of the specified value `value` in the linked
957
- * list. If the value is not found, it returns -1.
981
+ * The indexOf function in TypeScript returns the index of a specified element or node in a Doubly
982
+ * Linked List.
983
+ * @param {E | DoublyLinkedListNode<E>} elementOrNode - The `elementOrNode` parameter in the
984
+ * `indexOf` method can be either an element of type `E` or a `DoublyLinkedListNode` containing an
985
+ * element of type `E`.
986
+ * @returns The `indexOf` method is returning the index of the element or node in the doubly linked
987
+ * list. If the element or node is found in the list, the method returns the index of that element or
988
+ * node. If the element or node is not found in the list, the method returns -1.
958
989
  */
959
- indexOf(value: E): number {
990
+ indexOf(elementOrNode: E | DoublyLinkedListNode<E>): number {
991
+ const predicate = this._ensurePredicate(elementOrNode);
960
992
  let index = 0;
961
993
  let current = this.head;
962
994
  while (current) {
963
- if (current.value === value) {
995
+ if (predicate(current)) {
964
996
  return index;
965
997
  }
966
998
  index++;
@@ -973,19 +1005,48 @@ export class DoublyLinkedList<E = any, R = any> extends IterableElementBase<E, R
973
1005
  * Time Complexity: O(n)
974
1006
  * Space Complexity: O(1)
975
1007
  *
976
- * The `findBackward` function iterates through a linked list from the last node to the first node and returns the last
977
- * value that satisfies the given callback function, or undefined if no value satisfies the callback.
978
- * @param callback - A function that takes a value of type E as its parameter and returns a boolean value. This
979
- * function is used to determine whether a given value satisfies a certain condition.
980
- * @returns The method `findBackward` returns the last value in the linked list that satisfies the condition specified by
981
- * the callback function. If no value satisfies the condition, it returns `undefined`.
982
1008
  */
983
- findBackward(callback: (value: E) => boolean): E | undefined {
1009
+ /**
1010
+ * This function retrieves an element from a doubly linked list based on a given element
1011
+ * node or predicate.
1012
+ * @param {E | DoublyLinkedListNode<E> | ((node: DoublyLinkedListNode<E>) => boolean)} elementNodeOrPredicate
1013
+ * elementNodeOrPredicate - The `get` method takes in a parameter called `elementNodeOrPredicate`,
1014
+ * which can be one of the following types:
1015
+ * @returns The `get` method returns the value of the first node in the doubly linked list that
1016
+ * satisfies the provided predicate function. If no such node is found, it returns `undefined`.
1017
+ */
1018
+ get(
1019
+ elementNodeOrPredicate: E | DoublyLinkedListNode<E> | ((node: DoublyLinkedListNode<E>) => boolean)
1020
+ ): E | undefined {
1021
+ const predicate = this._ensurePredicate(elementNodeOrPredicate);
1022
+ let current = this.head;
1023
+ while (current) {
1024
+ if (predicate(current)) return current.value;
1025
+ current = current.next;
1026
+ }
1027
+ return undefined;
1028
+ }
1029
+
1030
+ /**
1031
+ * Time Complexity: O(n)
1032
+ * Space Complexity: O(1)
1033
+ *
1034
+ * The `getBackward` function searches for a specific element in a doubly linked list starting from
1035
+ * the tail and moving backwards.
1036
+ * @param {E | DoublyLinkedListNode<E> | ((node: DoublyLinkedListNode<E>) => boolean)} elementNodeOrPredicate
1037
+ * elementNodeOrPredicate - The `elementNodeOrPredicate` parameter in the `getBackward`
1038
+ * function can be one of the following types:
1039
+ * @returns The `getBackward` method returns the value of the element node that matches the provided
1040
+ * predicate when traversing the doubly linked list backwards. If no matching element is found, it
1041
+ * returns `undefined`.
1042
+ */
1043
+ getBackward(
1044
+ elementNodeOrPredicate: E | DoublyLinkedListNode<E> | ((node: DoublyLinkedListNode<E>) => boolean)
1045
+ ): E | undefined {
1046
+ const predicate = this._ensurePredicate(elementNodeOrPredicate);
984
1047
  let current = this.tail;
985
1048
  while (current) {
986
- if (callback(current.value)) {
987
- return current.value;
988
- }
1049
+ if (predicate(current)) return current.value;
989
1050
  current = current.prev;
990
1051
  }
991
1052
  return undefined;
@@ -1119,6 +1180,19 @@ export class DoublyLinkedList<E = any, R = any> extends IterableElementBase<E, R
1119
1180
  return mappedList;
1120
1181
  }
1121
1182
 
1183
+ /**
1184
+ * Time Complexity: O(n)
1185
+ * Space Complexity: O(n)
1186
+ *
1187
+ * The `fromArray` function creates a new instance of a DoublyLinkedList and populates it with the elements from the
1188
+ * given array.
1189
+ * @param {E[]} data - The `data` parameter is an array of elements of type `E`.
1190
+ * @returns The `fromArray` function returns a DoublyLinkedList object.
1191
+ */
1192
+ static fromArray<E>(data: E[]) {
1193
+ return new DoublyLinkedList<E>(data);
1194
+ }
1195
+
1122
1196
  /**
1123
1197
  * The function returns an iterator that iterates over the values of a linked list.
1124
1198
  */
@@ -1130,4 +1204,53 @@ export class DoublyLinkedList<E = any, R = any> extends IterableElementBase<E, R
1130
1204
  current = current.next;
1131
1205
  }
1132
1206
  }
1207
+
1208
+ /**
1209
+ * The function `_isPredicate` checks if the input is a function that takes a `DoublyLinkedListNode`
1210
+ * as an argument and returns a boolean.
1211
+ * @param {E | DoublyLinkedListNode<E> | ((node: DoublyLinkedListNode<E>) => boolean)} elementNodeOrPredicate
1212
+ * elementNodeOrPredicate - The `elementNodeOrPredicate` parameter can be one of the following
1213
+ * types:
1214
+ * @returns The _isPredicate method is returning a boolean value indicating whether the
1215
+ * elementNodeOrPredicate parameter is a function or not. If the elementNodeOrPredicate is a
1216
+ * function, the method will return true, indicating that it is a predicate function.
1217
+ */
1218
+ protected _isPredicate(
1219
+ elementNodeOrPredicate: E | DoublyLinkedListNode<E> | ((node: DoublyLinkedListNode<E>) => boolean)
1220
+ ): elementNodeOrPredicate is (node: DoublyLinkedListNode<E>) => boolean {
1221
+ return typeof elementNodeOrPredicate === 'function';
1222
+ }
1223
+
1224
+ /**
1225
+ * The function `_ensureNode` ensures that the input is a valid node in a doubly linked list.
1226
+ * @param {E | DoublyLinkedListNode<E>} elementOrNode - The `elementOrNode` parameter can be either
1227
+ * an element of type `E` or a `DoublyLinkedListNode` containing an element of type `E`.
1228
+ * @returns If the `elementOrNode` parameter is already a `DoublyLinkedListNode`, it will be returned
1229
+ * as is. Otherwise, a new `DoublyLinkedListNode` instance will be created with the `elementOrNode`
1230
+ * value and returned.
1231
+ */
1232
+ protected _ensureNode(elementOrNode: E | DoublyLinkedListNode<E>) {
1233
+ if (this.isNode(elementOrNode)) return elementOrNode;
1234
+
1235
+ return new DoublyLinkedListNode<E>(elementOrNode);
1236
+ }
1237
+
1238
+ /**
1239
+ * The function `_ensurePredicate` in TypeScript ensures that the input is either a node, a predicate
1240
+ * function, or a value to compare with the node's value.
1241
+ * @param {E | DoublyLinkedListNode<E> | ((node: DoublyLinkedListNode<E>) => boolean)} elementNodeOrPredicate
1242
+ * elementNodeOrPredicate - The `elementNodeOrPredicate` parameter can be one of the following
1243
+ * types:
1244
+ * @returns A function is being returned that takes a `DoublyLinkedListNode` as a parameter and
1245
+ * returns a boolean value based on the conditions specified in the code.
1246
+ */
1247
+ protected _ensurePredicate(
1248
+ elementNodeOrPredicate: E | DoublyLinkedListNode<E> | ((node: DoublyLinkedListNode<E>) => boolean)
1249
+ ) {
1250
+ if (this.isNode(elementNodeOrPredicate)) return (node: DoublyLinkedListNode<E>) => node === elementNodeOrPredicate;
1251
+
1252
+ if (this._isPredicate(elementNodeOrPredicate)) return elementNodeOrPredicate;
1253
+
1254
+ return (node: DoublyLinkedListNode<E>) => node.value === elementNodeOrPredicate;
1255
+ }
1133
1256
  }