# All files / src/utils binary-search.ts

100% Statements 15/15
100% Branches 4/4
100% Functions 1/1
100% Lines 15/15

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45

    1x

    9x
    9x
    9x
    9x

    9x
    21x
    21x

    21x
    21x
    10x
    11x
    4x

    7x

    2x

     type BinarySearchComparison < T > = (candidate: T) => -1 | 0 | 1;

    const BinarySearch = {

      /**
       * Searches for an item in an array which matches a certain condition.
       * This requires the condition to only match one item in the array,
       * and for the array to be ordered.
       *
       * @param {Array<T>} list The array to search.
       * @param {BinarySearchComparison<T>} comparisonFn
       *      Called and provided a candidate item as the first argument.
       *      Should return:
       *          > -1 if the item should be located at a lower index than the provided item.
       *          > 1 if the item should be located at a higher index than the provided item.
       *          > 0 if the item is the item you're looking for.
       *
       * @return {T | null} The object if it is found or null otherwise.
       */
      search: function<T> (list: T[], comparisonFn: BinarySearchComparison<T>): T | null {
        let minIndex: number = 0;
        let maxIndex: number = list.length - 1;
        let currentIndex: number | null = null;
        let currentElement: T | null = null;

        while (minIndex <= maxIndex) {
          currentIndex = (minIndex + maxIndex) / 2 | 0;
          currentElement = list[currentIndex];

          let comparisonResult = comparisonFn(currentElement);
          if (comparisonResult > 0) {
            minIndex = currentIndex + 1;
          } else if (comparisonResult < 0) {
            maxIndex = currentIndex - 1;
          } else {
            return currentElement;
          }
        }

        return null;
      }
    };

    export default BinarySearch;