"use strict"; /** * @license * Copyright 2019 Google LLC. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ============================================================================= */ Object.defineProperty(exports, "__esModule", { value: true }); /** * Inserts a value into a sorted array. This method allows duplicate, meaning it * allows inserting duplicate value, in which case, the element will be inserted * at the lowest index of the value. * @param arr The array to modify. * @param element The element to insert. * @param comparator Optional. If no comparator is specified, elements are * compared using array_util.defaultComparator, which is suitable for Strings * and Numbers in ascending arrays. If the array contains multiple instances of * the target value, the left-most instance will be returned. To provide a * comparator, it should take 2 arguments to compare and return a negative, * zero, or a positive number. */ function binaryInsert(arr, element, comparator) { var index = binarySearch(arr, element, comparator); var insertionPoint = index < 0 ? -(index + 1) : index; arr.splice(insertionPoint, 0, element); } exports.binaryInsert = binaryInsert; /** * Searches the array for the target using binary search, returns the index * of the found element, or position to insert if element not found. If no * comparator is specified, elements are compared using array_ * util.defaultComparator, which is suitable for Strings and Numbers in * ascending arrays. If the array contains multiple instances of the target * value, the left-most instance will be returned. * @param arr The array to be searched in. * @param target The target to be searched for. * @param comparator Should take 2 arguments to compare and return a negative, * zero, or a positive number. * @return Lowest index of the target value if found, otherwise the insertion * point where the target should be inserted, in the form of * (-insertionPoint - 1). */ function binarySearch(arr, target, comparator) { return binarySearch_(arr, target, comparator || defaultComparator); } exports.binarySearch = binarySearch; /** * Compares its two arguments for order. * @param a The first element to be compared. * @param b The second element to be compared. * @return A negative number, zero, or a positive number as the first * argument is less than, equal to, or greater than the second. */ function defaultComparator(a, b) { return a > b ? 1 : a < b ? -1 : 0; } function binarySearch_(arr, target, comparator) { var left = 0; var right = arr.length; var middle = 0; var found = false; while (left < right) { middle = left + ((right - left) >>> 1); var compareResult = comparator(target, arr[middle]); if (compareResult > 0) { left = middle + 1; } else { right = middle; // If compareResult is 0, the value is found. We record it is found, // and then keep looking because there may be duplicate. found = !compareResult; } } return found ? left : -left - 1; } //# sourceMappingURL=array_util.js.map