/** * Copyright 2014 Google Inc. * * 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. * * @fileoverview Array utility functions. */ goog.provide('shaka.util.ArrayUtils'); /** * @namespace shaka.util.ArrayUtils * @summary Array utility functions. */ /** * Intersect two arrays. Assumes that the arrays are already sorted. * @param {!Array} a * @param {!Array} b * @return {!Array} The intersection of a and b. * @throws {TypeError} if the array contents cannot be sorted or compared. */ shaka.util.ArrayUtils.intersect = function(a, b) { var ai = 0; var bi = 0; var result = []; while (ai < a.length && bi < b.length) { if (a[ai] < b[bi]) { ++ai; } else if (a[ai] > b[bi]) { ++bi; } else if (a[ai] == b[bi]) { result.push(a[ai]); ++ai; ++bi; } else { throw new TypeError('Cannot intersect non-sortable values!'); } } return result; }; /** * Create an array from object keys. * @param {!Object} object * @return {!Array} A sorted list of the keys. */ shaka.util.ArrayUtils.fromObjectKeys = function(object) { var result = []; for (var k in object) { result.push(k); } result.sort(); return result; }; /** * Remove duplicate entries from an array. * @param {!Array.} array * @param {function(T): string=} opt_keyFn An optional function which takes an * array item and converts it into a key. Use this if your array items * cannot be used as an index into an Object. * @return {!Array.} A sorted list of the keys. * @template T */ shaka.util.ArrayUtils.removeDuplicates = function(array, opt_keyFn) { var set = {}; for (var i = 0; i < array.length; ++i) { var key = opt_keyFn ? opt_keyFn(array[i]) : array[i].toString(); set[key] = array[i]; } var result = []; for (var k in set) { result.push(set[k]); } return result; };