1'use strict';
2
3Object.defineProperty(exports, "__esModule", {
4    value: true
5});
6
7var _once = require('./internal/once.js');
8
9var _once2 = _interopRequireDefault(_once);
10
11var _wrapAsync = require('./internal/wrapAsync.js');
12
13var _wrapAsync2 = _interopRequireDefault(_wrapAsync);
14
15var _awaitify = require('./internal/awaitify.js');
16
17var _awaitify2 = _interopRequireDefault(_awaitify);
18
19function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
20
21/**
22 * Runs the `tasks` array of functions in parallel, without waiting until the
23 * previous function has completed. Once any of the `tasks` complete or pass an
24 * error to its callback, the main `callback` is immediately called. It's
25 * equivalent to `Promise.race()`.
26 *
27 * @name race
28 * @static
29 * @memberOf module:ControlFlow
30 * @method
31 * @category Control Flow
32 * @param {Array} tasks - An array containing [async functions]{@link AsyncFunction}
33 * to run. Each function can complete with an optional `result` value.
34 * @param {Function} callback - A callback to run once any of the functions have
35 * completed. This function gets an error or result from the first function that
36 * completed. Invoked with (err, result).
37 * @returns {Promise} a promise, if a callback is omitted
38 * @example
39 *
40 * async.race([
41 *     function(callback) {
42 *         setTimeout(function() {
43 *             callback(null, 'one');
44 *         }, 200);
45 *     },
46 *     function(callback) {
47 *         setTimeout(function() {
48 *             callback(null, 'two');
49 *         }, 100);
50 *     }
51 * ],
52 * // main callback
53 * function(err, result) {
54 *     // the result will be equal to 'two' as it finishes earlier
55 * });
56 */
57function race(tasks, callback) {
58    callback = (0, _once2.default)(callback);
59    if (!Array.isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions'));
60    if (!tasks.length) return callback();
61    for (var i = 0, l = tasks.length; i < l; i++) {
62        (0, _wrapAsync2.default)(tasks[i])(callback);
63    }
64}
65
66exports.default = (0, _awaitify2.default)(race, 2);
67module.exports = exports['default'];