/**
* @license
* Copyright 2016 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.
*/
goog.provide('shaka.util.Functional');
/**
* @namespace shaka.util.Functional
* @summary A set of functional utility functions.
*/
/**
* Creates a promise chain that calls the given callback for each element in
* the array in a catch of a promise.
*
* e.g.:
* Promise.reject().catch(callback(array[0])).catch(callback(array[1]));
*
* @param {!Array.<ELEM>} array
* @param {function(ELEM):!Promise.<RESULT>} callback
* @return {!Promise.<RESULT>}
* @template ELEM,RESULT
*/
shaka.util.Functional.createFallbackPromiseChain = function(array, callback) {
return array.reduce(function(callback, promise, elem) {
return promise.catch(callback.bind(null, elem));
}.bind(null, callback), Promise.reject());
};
/**
* Returns the first array concatenated to the second; used to collapse an
* array of arrays into a single array.
*
* @param {!Array.<T>} all
* @param {!Array.<T>} part
* @return {!Array.<T>}
* @template T
*/
shaka.util.Functional.collapseArrays = function(all, part) {
return all.concat(part);
};
/**
* A no-op function. Useful in promise chains.
*/
shaka.util.Functional.noop = function() {};
/**
* Returns if the given value is not null; useful for filtering out null values.
*
* @param {T} value
* @return {boolean}
* @template T
*/
shaka.util.Functional.isNotNull = function(value) {
return value != null;
};
/**
* Creates a function that returns whether the given value is equal to the given
* value.
*
* @param {T} compare
* @return {function(T):boolean}
* @template T
*/
shaka.util.Functional.isEqualFunc = function(compare) {
return function(a) { return a == compare; };
};
/**
* Creates a function that returns whether the given value is not equal to the
* given value.
*
* @param {T} compare
* @return {function(T):boolean}
* @template T
*/
shaka.util.Functional.isNotEqualFunc = function(compare) {
return function(a) { return a != compare; };
};
/**
* Used to filter out duplicates in an array.
* Returns true the first time the element is encountered. Returns false
* for all the subsequent encounters.
*
* @param {T} item
* @param {number} position
* @param {!Array.<T>} self
* @return {boolean}
* @template T
* @example [1, 1, 2].filter(shaka.util.Functional.isNotDuplicate) -> [1, 2]
*/
shaka.util.Functional.isNotDuplicate = function(item, position, self) {
return self.indexOf(item) == position;
};