summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Early <alexander.early@gmail.com>2016-03-11 20:20:28 -0800
committerAlexander Early <alexander.early@gmail.com>2016-03-11 20:20:28 -0800
commit5e54bda8a7c5da32f77b2686f1aa023f1c595f1f (patch)
tree2408836b040e944a7efd96de28f1e8d660547082
parent1db668ee045c69df6511d6265a52ebfb84020e94 (diff)
parentde92ceee834617be9ae793b73b8034fba511bd62 (diff)
downloadasync-5e54bda8a7c5da32f77b2686f1aa023f1c595f1f.tar.gz
Merge branch 'master' into retryable
-rw-r--r--CHANGELOG.md54
-rw-r--r--Makefile4
-rw-r--r--README.md128
-rw-r--r--dist/async.js6182
-rw-r--r--dist/async.min.js2
-rw-r--r--dist/async.min.map2
-rw-r--r--lib/auto.js163
-rw-r--r--lib/autoInject.js46
-rw-r--r--lib/everySeries.js6
-rw-r--r--lib/index.js16
-rw-r--r--lib/internal/setImmediate.js18
-rw-r--r--lib/nextTick.js4
-rw-r--r--lib/race.js7
-rw-r--r--lib/someSeries.js6
-rw-r--r--lib/waterfall.js33
-rw-r--r--mocha_test/auto.js41
-rw-r--r--mocha_test/autoInject.js77
-rw-r--r--mocha_test/detect.js14
-rw-r--r--mocha_test/every.js9
-rw-r--r--mocha_test/nextTick.js38
-rw-r--r--mocha_test/setImmediate.js24
-rw-r--r--mocha_test/some.js9
-rw-r--r--mocha_test/waterfall.js148
-rwxr-xr-xsupport/xyz.sh6
-rwxr-xr-xtest/test-async.js177
25 files changed, 4480 insertions, 2734 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3dc4946..9937ac4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,53 @@
+# v2.0.0
+
+Lots of changes here! The biggest feature is modularization. You can now `require("async/series")` to only require the `series` function. Every Async library function is available this way. You still can `require("async")` to require the entire library, like you could do before.
+
+We also provide Async as a collection of ES2015 modules. You can now `import each from 'async-es'` or `import waterfall from 'async-es/waterfall'`. If you are using only a few Async functions, and are using a ES bundler such as Rollup, this can significantly lower your build size.
+
+Major thanks to @Kikobeats and @megawac for doing the majority of the modularization work, as well as @jdalton and @Rich-Harris for advisory work on the general modularization strategy.
+
+ANother one of the general themes of the 2.0 release is standardization of what an "async" function is. We are now more strictly following the node-style continuation passing style. That is, an async function is a function that:
+
+1. Takes a variable number of arguments
+2. The last argument is always a callback
+3. The callback can accept any number of arguments
+4. The first argument passed to the callback will be treated as an error result, if the argument is truthy
+5. Any number of result arguments can be passed after the "error" argument
+6. The callback is called once and exactly once, either on the same tick or later tick of the JavaScript event loop.
+
+There were several cases where Async accepted some functions that did not strictly have these properties, most notably `auto`, and `every`/`some`/`filter`.
+
+Another theme is performance. We have eliminated internal deferrals in all cases where they make sense. For example, in `waterfall` and `auto`, there was a `setImmediate` between each task -- these deferrals have been removed. A `setImmediate` call can add up to 1ms of delay. This might not seem like a lot, but it can add up if you are using many Async functions in the course of processing a HTTP request, for example. Nearly all asynchronous functions that do I/O already have some sort of deferral built in, so the extra deferral is unnecessary. The trade-off of this change is removing our built-in stack-overflow defense. Many synchronous callback calls in series can quickly overflow the JS call stack. If you do have a function that is sometimes synchronous (calling its callback on the same tick), and are running into stack overflows, wrap it with `async.ensureAsync()`.
+
+## New Features
+
+- Async is now modularized. Individual functions can be `require()`d from the main package. (`require('async/auto')`) (#696)
+- Async is also available as a collection of ES2015 modules in the new `async-es` package. (`import forEachSeries from 'async-es'`) (#696)
+- Added `race`, analogous to `Promise.race()`. It will run an array of async tasks in parallel and will call its callback with the result of the first task to respond. (#568, #1038)
+- Added `timeout`, a wrapper for an async function that will make the task time-out after the specified time. (#1007, #1027)
+- `constant` supports dynamic arguments -- it will now always use its last argument as the callback. (#1016, #1052)
+- `setImmediate` and `nextTick` now support arguments to partially apply to the deferred function, like the node-native versions do. (#940, #1053)
+- Added `autoInject`, a relative of `auto` that automatically spreads a task's dependencies as arguments to the task function. (#608, #1055)
+- You can now limit the concurrency of `auto` tasks. (#635, #637)
+- Added `q.unsaturated` -- callback called when a `queue`'s number of running workers falls below a threshold. (#868, #1030, #1033, #1034)
+
+## Breaking changes
+
+- Calling a callback more than once is considered an error, and an error will be thrown. This had an explicit breaking change in `waterfall`. If you were relying on this behavior, you should more accurately represent your control flow as an event emitter or stream. (#814, #815, #1048, #1050)
+- `auto` task functions now always take the callback as the last argument. If a task has dependencies, the `results` object will be passed as the first argument. To migrate old task functions, wrap them with [`_.flip`](https://lodash.com/docs#flip) (#1036, #1042)
+- Internal `setImmediate` calls have been refactored away. This may make existing flows vulnerable to stack overflows if you use many synchronous functions in series. Use `ensureAsync` to work around this. (#696, #704, #1049, #1050)
+- `filter`, `reject`, `some`, `every`, and related functions now expect an error as the first callback argument, rather than just a simple boolean. Pass `null` as the first argument, or use `fs.access` instead of `fs.exists`. (#118, #774, #1028, #1041)
+- `{METHOD}` and `{METHOD}Series` are now implemented in terms of `{METHOD}Limit`. This is a major internal simplification, and is not expected to cause many problems, but it does subtly affect how functions execute internally. (#778, #847)
+- `retry`'s callback is now optional. Previously, omitting the callback would partially apply the function, meaning it could be passed directly as a task to `series` or `auto`.
+
+## Other
+
+- Added `someSeries` and `everySeries` for symmetry, as well as a complete set of `any`/`anyLimit`/`anySeries` and `all`/`/allLmit`/`allSeries` aliases.
+- Added `find` as an alias for `detect` (as well as `findLimit` and `findSeries`).
+- Various doc fixes (#1005, #1008, #1010, #1015, #1021, #1037)
+
+------------------------------------------
+
# v1.5.2
- Allow using `"constructor"` as an argument in `memoize` (#998)
- Give a better error messsage when `auto` dependency checking fails (#994)
@@ -80,7 +130,7 @@ Bug Fixes:
Bug Fix:
-- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. (#782)
+- Small regression with synchronous iterator behavior in `eachSeries` with a 1-element array. Before 1.1.0, `eachSeries`'s callback was called on the same tick, which this patch restores. In 2.0.0, it will be called on the next tick. (#782)
# v1.1.0
@@ -92,7 +142,7 @@ New Features:
- Optimized `map`, `eachOf`, and `waterfall` families of functions
- Passing a `null` or `undefined` array to `map`, `each`, `parallel` and families will be treated as an empty array (#667).
- The callback is now optional for the composed results of `compose` and `seq`. (#618)
-- Reduced file size by 4kb, (minified version by 1kb)
+- Reduced file size by 4kb, (minified version by 1kb)
- Added code coverage through `nyc` and `coveralls` (#768)
Bug Fixes:
diff --git a/Makefile b/Makefile
index 80e8f52..39f0f71 100644
--- a/Makefile
+++ b/Makefile
@@ -111,8 +111,8 @@ build: clean build-bundle build-dist build-es build-config build-es-config test-
.PHONY: test lint build all clean
-.PHONY: release-major release-minor release-patch
-release-major release-minor release-patch: all
+.PHONY: release-major release-minor release-patch release-prerelease
+release-major release-minor release-patch release-prerelease: all
git add --force $(DIST)
git commit -am "update minified build"; true
$(XYZ) --increment $(@:release-%=%)
diff --git a/README.md b/README.md
index c7ec1a1..734e1aa 100644
--- a/README.md
+++ b/README.md
@@ -200,8 +200,8 @@ Some functions are also available in the following forms:
* [`reduce`](#reduce), [`reduceRight`](#reduceRight)
* [`detect`](#detect), `detectSeries`, `detectLimit`
* [`sortBy`](#sortBy)
-* [`some`](#some), `someLimit`
-* [`every`](#every), `everyLimit`
+* [`some`](#some), `someLimit`, `someSeries`
+* [`every`](#every), `everyLimit`, `everySeries`
* [`concat`](#concat), `concatSeries`
### Control Flow
@@ -219,6 +219,7 @@ Some functions are also available in the following forms:
* [`queue`](#queue), [`priorityQueue`](#priorityQueue)
* [`cargo`](#cargo)
* [`auto`](#auto)
+* [`autoInject`](#autoInject)
* [`retry`](#retry)
* [`iterator`](#iterator)
* [`times`](#times), `timesSeries`, `timesLimit`
@@ -243,6 +244,7 @@ Some functions are also available in the following forms:
<a name="forEach"></a>
<a name="each"></a>
+
### each(arr, iteratee, [callback])
Applies the function `iteratee` to each item in `arr`, in parallel.
@@ -313,6 +315,7 @@ __Related__
<a name="forEachOf"></a>
<a name="eachOf"></a>
+
### forEachOf(obj, iteratee, [callback])
Like `each`, except that it iterates over objects, and passes the key as the second argument to the iteratee.
@@ -358,6 +361,7 @@ __Related__
---------------------------------------
<a name="map"></a>
+
### map(arr, iteratee, [callback])
Produces a new array of values by mapping each value in `arr` through
@@ -397,6 +401,7 @@ __Related__
<a name="select"></a>
<a name="filter"></a>
+
### filter(arr, iteratee, [callback])
__Alias:__ `select`
@@ -434,6 +439,7 @@ __Related__
---------------------------------------
<a name="reject"></a>
+
### reject(arr, iteratee, [callback])
The opposite of [`filter`](#filter). Removes values that pass an `async` truth test.
@@ -446,6 +452,7 @@ __Related__
---------------------------------------
<a name="reduce"></a>
+
### reduce(arr, memo, iteratee, [callback])
__Aliases:__ `inject`, `foldl`
@@ -488,6 +495,7 @@ async.reduce([1,2,3], 0, function(memo, item, callback){
---------------------------------------
<a name="reduceRight"></a>
+
### reduceRight(arr, memo, iteratee, [callback])
__Alias:__ `foldr`
@@ -497,8 +505,11 @@ Same as [`reduce`](#reduce), only operates on `arr` in reverse order.
---------------------------------------
<a name="detect"></a>
+
### detect(arr, iteratee, [callback])
+__Alias:__ `find`
+
Returns the first value in `arr` that passes an async truth test. The
`iteratee` is applied in parallel, meaning the first iteratee to return `true` will
fire the detect `callback` with that result. That means the result might not be
@@ -537,6 +548,7 @@ __Related__
---------------------------------------
<a name="sortBy"></a>
+
### sortBy(arr, iteratee, [callback])
Sorts a list by the results of running each `arr` value through an async `iteratee`.
@@ -588,6 +600,7 @@ async.sortBy([1,9,3,5], function(x, callback){
---------------------------------------
<a name="some"></a>
+
### some(arr, iteratee, [callback])
__Alias:__ `any`
@@ -619,11 +632,13 @@ async.some(['file1','file2','file3'], function(filePath, callback) {
__Related__
+* someSeries(arr, iteratee, callback)
* someLimit(arr, limit, iteratee, callback)
---------------------------------------
<a name="every"></a>
+
### every(arr, iteratee, [callback])
__Alias:__ `all`
@@ -655,11 +670,13 @@ async.every(['file1','file2','file3'], function(filePath, callback) {
__Related__
+* everySeries(arr, iteratee, callback)
* everyLimit(arr, limit, iteratee, callback)
---------------------------------------
<a name="concat"></a>
+
### concat(arr, iteratee, [callback])
Applies `iteratee` to each item in `arr`, concatenating the results. Returns the
@@ -693,6 +710,7 @@ __Related__
## Control Flow
<a name="series"></a>
+
### series(tasks, [callback])
Run the functions in the `tasks` array in series, each one running once the previous
@@ -763,6 +781,7 @@ function(err, results) {
---------------------------------------
<a name="parallel"></a>
+
### parallel(tasks, [callback])
Run the `tasks` array of functions in parallel, without waiting until the previous
@@ -835,6 +854,7 @@ __Related__
---------------------------------------
<a name="whilst"></a>
+
### whilst(test, fn, callback)
Repeatedly call `fn`, while `test` returns `true`. Calls `callback` when stopped,
@@ -872,6 +892,7 @@ async.whilst(
---------------------------------------
<a name="doWhilst"></a>
+
### doWhilst(fn, test, callback)
The post-check version of [`whilst`](#whilst). To reflect the difference in
@@ -882,6 +903,7 @@ the order of operations, the arguments `test` and `fn` are switched.
---------------------------------------
<a name="until"></a>
+
### until(test, fn, callback)
Repeatedly call `fn` until `test` returns `true`. Calls `callback` when stopped,
@@ -893,6 +915,7 @@ The inverse of [`whilst`](#whilst).
---------------------------------------
<a name="doUntil"></a>
+
### doUntil(fn, test, callback)
Like [`doWhilst`](#doWhilst), except the `test` is inverted. Note the argument ordering differs from `until`.
@@ -900,6 +923,7 @@ Like [`doWhilst`](#doWhilst), except the `test` is inverted. Note the argument o
---------------------------------------
<a name="during"></a>
+
### during(test, fn, callback)
Like [`whilst`](#whilst), except the `test` is an asynchronous function that is passed a callback in the form of `function (err, truth)`. If error is passed to `test` or `fn`, the main callback is immediately called with the value of the error.
@@ -926,6 +950,7 @@ async.during(
---------------------------------------
<a name="doDuring"></a>
+
### doDuring(fn, test, callback)
The post-check version of [`during`](#during). To reflect the difference in
@@ -936,6 +961,7 @@ Also a version of [`doWhilst`](#doWhilst) with asynchronous `test` function.
---------------------------------------
<a name="forever"></a>
+
### forever(fn, [errback])
Calls the asynchronous function `fn` with a callback parameter that allows it to
@@ -960,6 +986,7 @@ async.forever(
---------------------------------------
<a name="waterfall"></a>
+
### waterfall(tasks, [callback])
Runs the `tasks` array of functions in series, each passing their results to the next in
@@ -1047,6 +1074,7 @@ function myLastFunction(arg1, callback) {
---------------------------------------
<a name="compose"></a>
+
### compose(fn1, fn2...)
Creates a function which is a composition of the passed asynchronous
@@ -1086,6 +1114,7 @@ add1mul3(4, function (err, result) {
---------------------------------------
<a name="seq"></a>
+
### seq(fn1, fn2...)
Version of the compose function that is more natural to read.
@@ -1127,6 +1156,7 @@ app.get('/cats', function(request, response) {
---------------------------------------
<a name="applyEach"></a>
+
### applyEach(fns, args..., callback)
Applies the provided arguments to each function in the array, calling
@@ -1162,6 +1192,7 @@ __Related__
---------------------------------------
<a name="queue"></a>
+
### queue(worker, [concurrency])
Creates a `queue` object with the specified `concurrency`. Tasks added to the
@@ -1245,6 +1276,7 @@ q.unshift({name: 'bar'}, function (err) {
---------------------------------------
<a name="priorityQueue"></a>
+
### priorityQueue(worker, concurrency)
The same as [`queue`](#queue) only tasks are assigned a priority and completed in ascending priority order. There are two differences between `queue` and `priorityQueue` objects:
@@ -1256,6 +1288,7 @@ The same as [`queue`](#queue) only tasks are assigned a priority and completed i
---------------------------------------
<a name="cargo"></a>
+
### cargo(worker, [payload])
Creates a `cargo` object with the specified payload. Tasks added to the
@@ -1291,7 +1324,7 @@ methods:
* `saturated` - A callback that is called when the `queue.length()` hits the concurrency and further tasks will be queued.
* `empty` - A callback that is called when the last item from the `queue` is given to a `worker`.
* `drain` - A callback that is called when the last item from the `queue` has returned from the `worker`.
-* `idle()`, `pause()`, `resume()`, `kill()` - cargo inherits all of the same methods and event calbacks as [`queue`](#queue)
+* `idle()`, `pause()`, `resume()`, `kill()` - cargo inherits all of the same methods and event callbacks as [`queue`](#queue)
__Example__
@@ -1322,6 +1355,7 @@ cargo.push({name: 'baz'}, function (err) {
---------------------------------------
<a name="auto"></a>
+
### auto(tasks, [concurrency], [callback])
Determines the best order for running the functions in `tasks`, based on their requirements. Each function can optionally depend on other functions being completed first, and each function is run as soon as its requirements are satisfied.
@@ -1421,8 +1455,76 @@ function(err, results){
For a complicated series of `async` tasks, using the [`auto`](#auto) function makes adding new tasks much easier (and the code more readable).
---------------------------------------
+<a name="autoInject" />
+### autoInject(tasks, [callback])
+
+A dependency-injected version of the [`auto`](#auto) function. Dependent tasks are specified as parameters to the function, after the usual callback parameter, with the parameter names matching the names of the tasks it depends on. This can provide even more readable task graphs which can be easier to maintain.
+
+If a final callback is specified, the task results are similarly injected, specified as named parameters after the initial error parameter.
+
+The autoInject function is purely syntactic sugar and its semantics are otherwise equivalent to [`auto`](#auto).
+
+__Arguments__
+
+* `tasks` - An object, each of whose properties is a function of the form
+ 'func([dependencies...], callback). The object's key of a property serves as the name of the task defined by that property, i.e. can be used when specifying requirements for other tasks.
+ * The `callback` parameter is a `callback(err, result)` which must be called when finished, passing an `error` (which can be `null`) and the result of the function's execution. The remaining parameters name other tasks on which the task is dependent, and the results from those tasks are the arguments of those parameters.
+* `callback(err, [results...])` - An optional callback which is called when all the tasks have been completed. It receives the `err` argument if any `tasks` pass an error to their callback. The remaining parameters are task names whose results you are interested in. This callback will only be called when all tasks have finished or an error has occurred, and so do not not specify dependencies in the same way as `tasks` do. If an error occurs, no further `tasks` will be performed, and `results` will only be valid for those tasks which managed to complete.
+
+
+__Example__
+
+The example from [`auto`](#auto) can be rewritten as follows:
+
+```js
+async.autoInject({
+ get_data: function(callback){
+ // async code to get some data
+ callback(null, 'data', 'converted to array');
+ },
+ make_folder: function(callback){
+ // async code to create a directory to store a file in
+ // this is run at the same time as getting the data
+ callback(null, 'folder');
+ },
+ write_file: function(get_data, make_folder, callback){
+ // once there is some data and the directory exists,
+ // write the data to a file in the directory
+ callback(null, 'filename');
+ },
+ email_link: function(write_file, callback){
+ // once the file is written let's email a link to it...
+ // write_file contains the filename returned by write_file.
+ callback(null, {'file':write_file, 'email':'user@example.com'});
+ }
+}, function(err, email_link) {
+ console.log('err = ', err);
+ console.log('email_link = ', email_link);
+});
+```
+
+If you are using a JS minifier that mangles parameter names, `autoInject` will not work with plain functions, since the parameter names will be collapsed to a single letter identifier. To work around this, you can explicitly specify the names of the parameters your task function needs in an array, similar to Angular.js dependency injection.
+
+```js
+async.autoInject({
+ //...
+ write_file: ['get_data', 'make_folder', function(get_data, make_folder, callback){
+ callback(null, 'filename');
+ }],
+ email_link: ['write_file', function(write_file, callback){
+ callback(null, {'file':write_file, 'email':'user@example.com'});
+ }]
+ //...
+},
+```
+
+This still has an advantage over plain `auto`, since the results a task depends on are still spread into arguments.
+
+
+---------------------------------------
<a name="retry"></a>
+
### retry([opts = {times: 5, interval: 0}| 5], task, [callback])
Attempts to get a successful response from `task` no more than `times` times before
@@ -1481,6 +1583,7 @@ async.auto({
---------------------------------------
<a name="iterator"></a>
+
### iterator(tasks)
Creates an iterator function which calls the next function in the `tasks` array,
@@ -1517,6 +1620,7 @@ node> nextfn();
## Utils
<a name="apply"></a>
+
### apply(function, arguments..)
Creates a continuation function with some arguments already applied.
@@ -1568,7 +1672,8 @@ three
---------------------------------------
<a name="nextTick"></a>
-### nextTick(callback), setImmediate(callback)
+
+### nextTick(callback, [args...]), setImmediate(callback, [args...])
Calls `callback` on a later loop around the event loop. In Node.js this just
calls `process.nextTick`; in the browser it falls back to `setImmediate(callback)`
@@ -1580,6 +1685,7 @@ This is used internally for browser-compatibility purposes.
__Arguments__
* `callback` - The function to call on a later loop around the event loop.
+* `args...` - any number of additional arguments to pass to the callback on the next tick
__Example__
@@ -1590,11 +1696,16 @@ async.nextTick(function(){
// call_order now equals ['one','two']
});
call_order.push('one')
+
+async.setImmediate(function (a, b, c) {
+ // a, b, and c equal 1, 2, and 3
+}, 1, 2, 3)
```
---------------------------------------
<a name="times"></a>
+
### times(n, iteratee, [callback])
Calls the `iteratee` function `n` times, and accumulates results in the same manner
@@ -1673,6 +1784,7 @@ function(err, result){
---------------------------------------
<a name="memoize"></a>
+
### memoize(fn, [hasher])
Caches the results of an `async` function. When creating a hash to store function
@@ -1709,6 +1821,7 @@ fn('some name', function () {
---------------------------------------
<a name="unmemoize"></a>
+
### unmemoize(fn)
Undoes a [`memoize`](#memoize)d function, reverting it to the original, unmemoized
@@ -1721,6 +1834,7 @@ __Arguments__
---------------------------------------
<a name="ensureAsync"></a>
+
### ensureAsync(fn)
Wrap an async function and ensure it calls its callback on a later tick of the event loop. If the function already calls its callback on a next tick, no extra deferral is added. This is useful for preventing stack overflows (`RangeError: Maximum call stack size exceeded`) and generally keeping [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony) contained.
@@ -1754,6 +1868,7 @@ async.mapSeries(args, async.ensureAsync(sometimesAsync), done);
---------------------------------------
<a name="constant"></a>
+
### constant(values...)
Returns a function that when called, calls-back with the values provided. Useful as the first function in a `waterfall`, or for plugging values in to `auto`.
@@ -1793,6 +1908,7 @@ async.auto({
<a name="asyncify"></a>
<a name="wrapSync"></a>
+
### asyncify(func)
__Alias:__ `wrapSync`
@@ -1841,6 +1957,7 @@ q.push(files);
---------------------------------------
<a name="log"></a>
+
### log(function, arguments)
Logs the result of an `async` function to the `console`. Only works in Node.js or
@@ -1870,6 +1987,7 @@ node> async.log(hello, 'world');
---------------------------------------
<a name="dir"></a>
+
### dir(function, arguments)
Logs the result of an `async` function to the `console` using `console.dir` to
@@ -1900,6 +2018,7 @@ node> async.dir(hello, 'world');
---------------------------------------
<a name="noConflict"></a>
+
### noConflict()
Changes the value of `async` back to its original value, returning a reference to the
@@ -1908,6 +2027,7 @@ Changes the value of `async` back to its original value, returning a reference t
---------------------------------------
<a name="timeout"></a>
+
### timeout(function, miliseconds)
Sets a time limit on an asynchronous function. If the function does not call its callback within the specified miliseconds, it will be called with a timeout error. The code property for the error object will be `'ETIMEDOUT'`.
diff --git a/dist/async.js b/dist/async.js
index 0032ce5..ff7031e 100644
--- a/dist/async.js
+++ b/dist/async.js
@@ -1,2563 +1,3895 @@
(function (global, factory) {
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
- typeof define === 'function' && define.amd ? define(['exports'], factory) :
- (factory((global.async = {})));
+ typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
+ typeof define === 'function' && define.amd ? define(['exports'], factory) :
+ (factory((global.async = global.async || {})));
}(this, function (exports) { 'use strict';
- /**
- * A faster alternative to `Function#apply`, this function invokes `func`
- * with the `this` binding of `thisArg` and the arguments of `args`.
- *
- * @private
- * @param {Function} func The function to invoke.
- * @param {*} thisArg The `this` binding of `func`.
- * @param {...*} args The arguments to invoke `func` with.
- * @returns {*} Returns the result of `func`.
- */
- function apply$1(func, thisArg, args) {
- var length = args.length;
- switch (length) {
- case 0: return func.call(thisArg);
- case 1: return func.call(thisArg, args[0]);
- case 2: return func.call(thisArg, args[0], args[1]);
- case 3: return func.call(thisArg, args[0], args[1], args[2]);
- }
- return func.apply(thisArg, args);
- }
-
- /**
- * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
- * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an object, else `false`.
- * @example
- *
- * _.isObject({});
- * // => true
- *
- * _.isObject([1, 2, 3]);
- * // => true
- *
- * _.isObject(_.noop);
- * // => true
- *
- * _.isObject(null);
- * // => false
- */
- function isObject(value) {
- var type = typeof value;
- return !!value && (type == 'object' || type == 'function');
- }
-
- var funcTag = '[object Function]';
- var genTag = '[object GeneratorFunction]';
- /** Used for built-in method references. */
- var objectProto$4 = Object.prototype;
-
- /**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
- var objectToString$2 = objectProto$4.toString;
-
- /**
- * Checks if `value` is classified as a `Function` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isFunction(_);
- * // => true
- *
- * _.isFunction(/abc/);
- * // => false
- */
- function isFunction(value) {
- // The use of `Object#toString` avoids issues with the `typeof` operator
- // in Safari 8 which returns 'object' for typed array constructors, and
- // PhantomJS 1.9 which returns 'function' for `NodeList` instances.
- var tag = isObject(value) ? objectToString$2.call(value) : '';
- return tag == funcTag || tag == genTag;
- }
-
- /** Used as references for various `Number` constants. */
- var NAN = 0 / 0;
-
- /** Used to match leading and trailing whitespace. */
- var reTrim = /^\s+|\s+$/g;
-
- /** Used to detect bad signed hexadecimal string values. */
- var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
-
- /** Used to detect binary string values. */
- var reIsBinary = /^0b[01]+$/i;
-
- /** Used to detect octal string values. */
- var reIsOctal = /^0o[0-7]+$/i;
-
- /** Built-in method references without a dependency on `root`. */
- var freeParseInt = parseInt;
-
- /**
- * Converts `value` to a number.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to process.
- * @returns {number} Returns the number.
- * @example
- *
- * _.toNumber(3);
- * // => 3
- *
- * _.toNumber(Number.MIN_VALUE);
- * // => 5e-324
- *
- * _.toNumber(Infinity);
- * // => Infinity
- *
- * _.toNumber('3');
- * // => 3
- */
- function toNumber(value) {
- if (isObject(value)) {
- var other = isFunction(value.valueOf) ? value.valueOf() : value;
- value = isObject(other) ? (other + '') : other;
- }
- if (typeof value != 'string') {
- return value === 0 ? value : +value;
- }
- value = value.replace(reTrim, '');
- var isBinary = reIsBinary.test(value);
- return (isBinary || reIsOctal.test(value))
- ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
- : (reIsBadHex.test(value) ? NAN : +value);
- }
-
- var INFINITY = 1 / 0;
- var MAX_INTEGER = 1.7976931348623157e+308;
- /**
- * Converts `value` to an integer.
- *
- * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to convert.
- * @returns {number} Returns the converted integer.
- * @example
- *
- * _.toInteger(3);
- * // => 3
- *
- * _.toInteger(Number.MIN_VALUE);
- * // => 0
- *
- * _.toInteger(Infinity);
- * // => 1.7976931348623157e+308
- *
- * _.toInteger('3');
- * // => 3
- */
- function toInteger(value) {
- if (!value) {
- return value === 0 ? value : 0;
- }
- value = toNumber(value);
- if (value === INFINITY || value === -INFINITY) {
- var sign = (value < 0 ? -1 : 1);
- return sign * MAX_INTEGER;
- }
- var remainder = value % 1;
- return value === value ? (remainder ? value - remainder : value) : 0;
- }
-
- /** Used as the `TypeError` message for "Functions" methods. */
- var FUNC_ERROR_TEXT = 'Expected a function';
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeMax = Math.max;
-
- /**
- * Creates a function that invokes `func` with the `this` binding of the
- * created function and arguments from `start` and beyond provided as an array.
- *
- * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to apply a rest parameter to.
- * @param {number} [start=func.length-1] The start position of the rest parameter.
- * @returns {Function} Returns the new function.
- * @example
- *
- * var say = _.rest(function(what, names) {
- * return what + ' ' + _.initial(names).join(', ') +
- * (_.size(names) > 1 ? ', & ' : '') + _.last(names);
- * });
- *
- * say('hello', 'fred', 'barney', 'pebbles');
- * // => 'hello fred, barney, & pebbles'
- */
- function rest(func, start) {
- if (typeof func != 'function') {
- throw new TypeError(FUNC_ERROR_TEXT);
- }
- start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);
- return function() {
- var args = arguments,
- index = -1,
- length = nativeMax(args.length - start, 0),
- array = Array(length);
-
- while (++index < length) {
- array[index] = args[start + index];
+ /**
+ * A faster alternative to `Function#apply`, this function invokes `func`
+ * with the `this` binding of `thisArg` and the arguments of `args`.
+ *
+ * @private
+ * @param {Function} func The function to invoke.
+ * @param {*} thisArg The `this` binding of `func`.
+ * @param {...*} args The arguments to invoke `func` with.
+ * @returns {*} Returns the result of `func`.
+ */
+ function apply(func, thisArg, args) {
+ var length = args.length;
+ switch (length) {
+ case 0: return func.call(thisArg);
+ case 1: return func.call(thisArg, args[0]);
+ case 2: return func.call(thisArg, args[0], args[1]);
+ case 3: return func.call(thisArg, args[0], args[1], args[2]);
}
- switch (start) {
- case 0: return func.call(this, array);
- case 1: return func.call(this, args[0], array);
- case 2: return func.call(this, args[0], args[1], array);
+ return func.apply(thisArg, args);
+ }
+
+ /**
+ * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`.
+ * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an object, else `false`.
+ * @example
+ *
+ * _.isObject({});
+ * // => true
+ *
+ * _.isObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isObject(_.noop);
+ * // => true
+ *
+ * _.isObject(null);
+ * // => false
+ */
+ function isObject(value) {
+ var type = typeof value;
+ return !!value && (type == 'object' || type == 'function');
+ }
+
+ var funcTag = '[object Function]';
+ var genTag = '[object GeneratorFunction]';
+ /** Used for built-in method references. */
+ var objectProto = Object.prototype;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objectToString = objectProto.toString;
+
+ /**
+ * Checks if `value` is classified as a `Function` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isFunction(_);
+ * // => true
+ *
+ * _.isFunction(/abc/);
+ * // => false
+ */
+ function isFunction(value) {
+ // The use of `Object#toString` avoids issues with the `typeof` operator
+ // in Safari 8 which returns 'object' for typed array and weak map constructors,
+ // and PhantomJS 1.9 which returns 'function' for `NodeList` instances.
+ var tag = isObject(value) ? objectToString.call(value) : '';
+ return tag == funcTag || tag == genTag;
+ }
+
+ /** Used as references for various `Number` constants. */
+ var NAN = 0 / 0;
+
+ /** Used to match leading and trailing whitespace. */
+ var reTrim = /^\s+|\s+$/g;
+
+ /** Used to detect bad signed hexadecimal string values. */
+ var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
+
+ /** Used to detect binary string values. */
+ var reIsBinary = /^0b[01]+$/i;
+
+ /** Used to detect octal string values. */
+ var reIsOctal = /^0o[0-7]+$/i;
+
+ /** Built-in method references without a dependency on `root`. */
+ var freeParseInt = parseInt;
+
+ /**
+ * Converts `value` to a number.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to process.
+ * @returns {number} Returns the number.
+ * @example
+ *
+ * _.toNumber(3);
+ * // => 3
+ *
+ * _.toNumber(Number.MIN_VALUE);
+ * // => 5e-324
+ *
+ * _.toNumber(Infinity);
+ * // => Infinity
+ *
+ * _.toNumber('3');
+ * // => 3
+ */
+ function toNumber(value) {
+ if (isObject(value)) {
+ var other = isFunction(value.valueOf) ? value.valueOf() : value;
+ value = isObject(other) ? (other + '') : other;
}
- var otherArgs = Array(start + 1);
- index = -1;
- while (++index < start) {
- otherArgs[index] = args[index];
+ if (typeof value != 'string') {
+ return value === 0 ? value : +value;
}
- otherArgs[start] = array;
- return apply$1(func, this, otherArgs);
- };
- }
-
- function applyEach$1(eachfn) {
- return rest(function (fns, args) {
- var go = rest(function (args) {
- var that = this;
- var callback = args.pop();
- return eachfn(fns, function (fn, _, cb) {
- fn.apply(that, args.concat([cb]));
- }, callback);
- });
- if (args.length) {
- return go.apply(this, args);
- } else {
- return go;
- }
- });
- }
-
- /** Used as the `TypeError` message for "Functions" methods. */
- var FUNC_ERROR_TEXT$1 = 'Expected a function';
-
- /**
- * Creates a function that invokes `func`, with the `this` binding and arguments
- * of the created function, while it's called less than `n` times. Subsequent
- * calls to the created function return the result of the last `func` invocation.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {number} n The number of calls at which `func` is no longer invoked.
- * @param {Function} func The function to restrict.
- * @returns {Function} Returns the new restricted function.
- * @example
- *
- * jQuery(element).on('click', _.before(5, addContactToList));
- * // => allows adding up to 4 contacts to the list
- */
- function before(n, func) {
- var result;
- if (typeof func != 'function') {
- throw new TypeError(FUNC_ERROR_TEXT$1);
- }
- n = toInteger(n);
- return function() {
- if (--n > 0) {
- result = func.apply(this, arguments);
+ value = value.replace(reTrim, '');
+ var isBinary = reIsBinary.test(value);
+ return (isBinary || reIsOctal.test(value))
+ ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
+ : (reIsBadHex.test(value) ? NAN : +value);
+ }
+
+ var INFINITY = 1 / 0;
+ var MAX_INTEGER = 1.7976931348623157e+308;
+ /**
+ * Converts `value` to an integer.
+ *
+ * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger).
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to convert.
+ * @returns {number} Returns the converted integer.
+ * @example
+ *
+ * _.toInteger(3);
+ * // => 3
+ *
+ * _.toInteger(Number.MIN_VALUE);
+ * // => 0
+ *
+ * _.toInteger(Infinity);
+ * // => 1.7976931348623157e+308
+ *
+ * _.toInteger('3');
+ * // => 3
+ */
+ function toInteger(value) {
+ if (!value) {
+ return value === 0 ? value : 0;
}
- if (n <= 1) {
- func = undefined;
+ value = toNumber(value);
+ if (value === INFINITY || value === -INFINITY) {
+ var sign = (value < 0 ? -1 : 1);
+ return sign * MAX_INTEGER;
}
- return result;
- };
- }
-
- /**
- * Creates a function that is restricted to invoking `func` once. Repeat calls
- * to the function return the value of the first invocation. The `func` is
- * invoked with the `this` binding and arguments of the created function.
- *
- * @static
- * @memberOf _
- * @category Function
- * @param {Function} func The function to restrict.
- * @returns {Function} Returns the new restricted function.
- * @example
- *
- * var initialize = _.once(createApplication);
- * initialize();
- * initialize();
- * // `initialize` invokes `createApplication` once
- */
- function once(func) {
- return before(2, func);
- }
-
- /**
- * A no-operation function that returns `undefined` regardless of the
- * arguments it receives.
- *
- * @static
- * @memberOf _
- * @category Util
- * @example
- *
- * var object = { 'user': 'fred' };
- *
- * _.noop(object) === undefined;
- * // => true
- */
- function noop() {
- // No operation performed.
- }
-
- /**
- * The base implementation of `_.property` without support for deep paths.
- *
- * @private
- * @param {string} key The key of the property to get.
- * @returns {Function} Returns the new function.
- */
- function baseProperty(key) {
- return function(object) {
- return object == null ? undefined : object[key];
- };
- }
-
- /**
- * Gets the "length" property value of `object`.
- *
- * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
- * that affects Safari on at least iOS 8.1-8.3 ARM64.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {*} Returns the "length" value.
- */
- var getLength = baseProperty('length');
-
- /** Used as references for various `Number` constants. */
- var MAX_SAFE_INTEGER$1 = 9007199254740991;
-
- /**
- * Checks if `value` is a valid array-like length.
- *
- * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
- * @example
- *
- * _.isLength(3);
- * // => true
- *
- * _.isLength(Number.MIN_VALUE);
- * // => false
- *
- * _.isLength(Infinity);
- * // => false
- *
- * _.isLength('3');
- * // => false
- */
- function isLength(value) {
- return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER$1;
- }
-
- /**
- * Checks if `value` is array-like. A value is considered array-like if it's
- * not a function and has a `value.length` that's an integer greater than or
- * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
- *
- * @static
- * @memberOf _
- * @type Function
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
- * @example
- *
- * _.isArrayLike([1, 2, 3]);
- * // => true
- *
- * _.isArrayLike(document.body.children);
- * // => true
- *
- * _.isArrayLike('abc');
- * // => true
- *
- * _.isArrayLike(_.noop);
- * // => false
- */
- function isArrayLike(value) {
- return value != null &&
- !(typeof value == 'function' && isFunction(value)) && isLength(getLength(value));
- }
-
- /** Used for built-in method references. */
- var objectProto = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty = objectProto.hasOwnProperty;
-
- /** Built-in value references. */
- var getPrototypeOf = Object.getPrototypeOf;
-
- /**
- * The base implementation of `_.has` without support for deep paths.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array|string} key The key to check.
- * @returns {boolean} Returns `true` if `key` exists, else `false`.
- */
- function baseHas(object, key) {
- // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,
- // that are composed entirely of index properties, return `false` for
- // `hasOwnProperty` checks of them.
- return hasOwnProperty.call(object, key) ||
- (typeof object == 'object' && key in object && getPrototypeOf(object) === null);
- }
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeKeys = Object.keys;
-
- /**
- * The base implementation of `_.keys` which doesn't skip the constructor
- * property of prototypes or treat sparse arrays as dense.
- *
- * @private
- * @type Function
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- */
- function baseKeys(object) {
- return nativeKeys(Object(object));
- }
-
- /**
- * The base implementation of `_.times` without support for iteratee shorthands
- * or max array length checks.
- *
- * @private
- * @param {number} n The number of times to invoke `iteratee`.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns the array of results.
- */
- function baseTimes(n, iteratee) {
- var index = -1,
- result = Array(n);
-
- while (++index < n) {
- result[index] = iteratee(index);
- }
- return result;
- }
-
- /**
- * Checks if `value` is object-like. A value is object-like if it's not `null`
- * and has a `typeof` result of "object".
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
- * @example
- *
- * _.isObjectLike({});
- * // => true
- *
- * _.isObjectLike([1, 2, 3]);
- * // => true
- *
- * _.isObjectLike(_.noop);
- * // => false
- *
- * _.isObjectLike(null);
- * // => false
- */
- function isObjectLike(value) {
- return !!value && typeof value == 'object';
- }
-
- /**
- * This method is like `_.isArrayLike` except that it also checks if `value`
- * is an object.
- *
- * @static
- * @memberOf _
- * @type Function
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.
- * @example
- *
- * _.isArrayLikeObject([1, 2, 3]);
- * // => true
- *
- * _.isArrayLikeObject(document.body.children);
- * // => true
- *
- * _.isArrayLikeObject('abc');
- * // => false
- *
- * _.isArrayLikeObject(_.noop);
- * // => false
- */
- function isArrayLikeObject(value) {
- return isObjectLike(value) && isArrayLike(value);
- }
-
- /** `Object#toString` result references. */
- var argsTag = '[object Arguments]';
-
- /** Used for built-in method references. */
- var objectProto$2 = Object.prototype;
-
- /** Used to check objects for own properties. */
- var hasOwnProperty$1 = objectProto$2.hasOwnProperty;
-
- /**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
- var objectToString = objectProto$2.toString;
-
- /** Built-in value references. */
- var propertyIsEnumerable = objectProto$2.propertyIsEnumerable;
-
- /**
- * Checks if `value` is likely an `arguments` object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isArguments(function() { return arguments; }());
- * // => true
- *
- * _.isArguments([1, 2, 3]);
- * // => false
- */
- function isArguments(value) {
- // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.
- return isArrayLikeObject(value) && hasOwnProperty$1.call(value, 'callee') &&
- (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);
- }
-
- /**
- * Checks if `value` is classified as an `Array` object.
- *
- * @static
- * @memberOf _
- * @type Function
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isArray([1, 2, 3]);
- * // => true
- *
- * _.isArray(document.body.children);
- * // => false
- *
- * _.isArray('abc');
- * // => false
- *
- * _.isArray(_.noop);
- * // => false
- */
- var isArray = Array.isArray;
-
- /** `Object#toString` result references. */
- var stringTag = '[object String]';
-
- /** Used for built-in method references. */
- var objectProto$3 = Object.prototype;
-
- /**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
- var objectToString$1 = objectProto$3.toString;
-
- /**
- * Checks if `value` is classified as a `String` primitive or object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isString('abc');
- * // => true
- *
- * _.isString(1);
- * // => false
- */
- function isString(value) {
- return typeof value == 'string' ||
- (!isArray(value) && isObjectLike(value) && objectToString$1.call(value) == stringTag);
- }
-
- /**
- * Creates an array of index keys for `object` values of arrays,
- * `arguments` objects, and strings, otherwise `null` is returned.
- *
- * @private
- * @param {Object} object The object to query.
- * @returns {Array|null} Returns index keys, else `null`.
- */
- function indexKeys(object) {
- var length = object ? object.length : undefined;
- if (isLength(length) &&
- (isArray(object) || isString(object) || isArguments(object))) {
- return baseTimes(length, String);
- }
- return null;
- }
-
- /** Used as references for various `Number` constants. */
- var MAX_SAFE_INTEGER = 9007199254740991;
-
- /** Used to detect unsigned integer values. */
- var reIsUint = /^(?:0|[1-9]\d*)$/;
-
- /**
- * Checks if `value` is a valid array-like index.
- *
- * @private
- * @param {*} value The value to check.
- * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
- * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
- */
- function isIndex(value, length) {
- value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
- length = length == null ? MAX_SAFE_INTEGER : length;
- return value > -1 && value % 1 == 0 && value < length;
- }
-
- /** Used for built-in method references. */
- var objectProto$1 = Object.prototype;
-
- /**
- * Checks if `value` is likely a prototype object.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
- */
- function isPrototype(value) {
- var Ctor = value && value.constructor,
- proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$1;
-
- return value === proto;
- }
-
- /**
- * Creates an array of the own enumerable property names of `object`.
- *
- * **Note:** Non-object values are coerced to objects. See the
- * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
- * for more details.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @returns {Array} Returns the array of property names.
- * @example
- *
- * function Foo() {
- * this.a = 1;
- * this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.keys(new Foo);
- * // => ['a', 'b'] (iteration order is not guaranteed)
- *
- * _.keys('hi');
- * // => ['0', '1']
- */
- function keys(object) {
- var isProto = isPrototype(object);
- if (!(isProto || isArrayLike(object))) {
- return baseKeys(object);
- }
- var indexes = indexKeys(object),
- skipIndexes = !!indexes,
- result = indexes || [],
- length = result.length;
-
- for (var key in object) {
- if (baseHas(object, key) &&
- !(skipIndexes && (key == 'length' || isIndex(key, length))) &&
- !(isProto && key == 'constructor')) {
- result.push(key);
+ var remainder = value % 1;
+ return value === value ? (remainder ? value - remainder : value) : 0;
+ }
+
+ /** Used as the `TypeError` message for "Functions" methods. */
+ var FUNC_ERROR_TEXT = 'Expected a function';
+
+ /* Built-in method references for those with the same name as other `lodash` methods. */
+ var nativeMax = Math.max;
+
+ /**
+ * Creates a function that invokes `func` with the `this` binding of the
+ * created function and arguments from `start` and beyond provided as an array.
+ *
+ * **Note:** This method is based on the [rest parameter](https://mdn.io/rest_parameters).
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to apply a rest parameter to.
+ * @param {number} [start=func.length-1] The start position of the rest parameter.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var say = _.rest(function(what, names) {
+ * return what + ' ' + _.initial(names).join(', ') +
+ * (_.size(names) > 1 ? ', & ' : '') + _.last(names);
+ * });
+ *
+ * say('hello', 'fred', 'barney', 'pebbles');
+ * // => 'hello fred, barney, & pebbles'
+ */
+ function rest(func, start) {
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT);
}
+ start = nativeMax(start === undefined ? (func.length - 1) : toInteger(start), 0);
+ return function() {
+ var args = arguments,
+ index = -1,
+ length = nativeMax(args.length - start, 0),
+ array = Array(length);
+
+ while (++index < length) {
+ array[index] = args[start + index];
+ }
+ switch (start) {
+ case 0: return func.call(this, array);
+ case 1: return func.call(this, args[0], array);
+ case 2: return func.call(this, args[0], args[1], array);
+ }
+ var otherArgs = Array(start + 1);
+ index = -1;
+ while (++index < start) {
+ otherArgs[index] = args[index];
+ }
+ otherArgs[start] = array;
+ return apply(func, this, otherArgs);
+ };
}
- return result;
- }
-
- function keyIterator(coll) {
- var i = -1;
- var len;
- if (isArrayLike(coll)) {
- len = coll.length;
- return function next() {
- i++;
- return i < len ? i : null;
- };
- } else {
- var okeys = keys(coll);
- len = okeys.length;
- return function next() {
- i++;
- return i < len ? okeys[i] : null;
- };
+
+ function applyEach$1(eachfn) {
+ return rest(function (fns, args) {
+ var go = rest(function (args) {
+ var that = this;
+ var callback = args.pop();
+ return eachfn(fns, function (fn, _, cb) {
+ fn.apply(that, args.concat([cb]));
+ }, callback);
+ });
+ if (args.length) {
+ return go.apply(this, args);
+ } else {
+ return go;
+ }
+ });
+ }
+
+ /**
+ * A no-operation function that returns `undefined` regardless of the
+ * arguments it receives.
+ *
+ * @static
+ * @memberOf _
+ * @category Util
+ * @example
+ *
+ * var object = { 'user': 'fred' };
+ *
+ * _.noop(object) === undefined;
+ * // => true
+ */
+ function noop() {
+ // No operation performed.
+ }
+
+ /** Used as the `TypeError` message for "Functions" methods. */
+ var FUNC_ERROR_TEXT$1 = 'Expected a function';
+
+ /**
+ * Creates a function that invokes `func`, with the `this` binding and arguments
+ * of the created function, while it's called less than `n` times. Subsequent
+ * calls to the created function return the result of the last `func` invocation.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {number} n The number of calls at which `func` is no longer invoked.
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * jQuery(element).on('click', _.before(5, addContactToList));
+ * // => allows adding up to 4 contacts to the list
+ */
+ function before(n, func) {
+ var result;
+ if (typeof func != 'function') {
+ throw new TypeError(FUNC_ERROR_TEXT$1);
}
- }
+ n = toInteger(n);
+ return function() {
+ if (--n > 0) {
+ result = func.apply(this, arguments);
+ }
+ if (n <= 1) {
+ func = undefined;
+ }
+ return result;
+ };
+ }
+
+ /**
+ * Creates a function that is restricted to invoking `func` once. Repeat calls
+ * to the function return the value of the first invocation. The `func` is
+ * invoked with the `this` binding and arguments of the created function.
+ *
+ * @static
+ * @memberOf _
+ * @category Function
+ * @param {Function} func The function to restrict.
+ * @returns {Function} Returns the new restricted function.
+ * @example
+ *
+ * var initialize = _.once(createApplication);
+ * initialize();
+ * initialize();
+ * // `initialize` invokes `createApplication` once
+ */
+ function once(func) {
+ return before(2, func);
+ }
- function onlyOnce(fn) {
- return function () {
- if (fn === null) throw new Error("Callback was already called.");
- fn.apply(this, arguments);
- fn = null;
+ /**
+ * The base implementation of `_.property` without support for deep paths.
+ *
+ * @private
+ * @param {string} key The key of the property to get.
+ * @returns {Function} Returns the new function.
+ */
+ function baseProperty(key) {
+ return function(object) {
+ return object == null ? undefined : object[key];
};
- }
+ }
- function eachOf(object, iterator, callback) {
- callback = once(callback || noop);
- object = object || [];
+ /**
+ * Gets the "length" property value of `object`.
+ *
+ * **Note:** This function is used to avoid a [JIT bug](https://bugs.webkit.org/show_bug.cgi?id=142792)
+ * that affects Safari on at least iOS 8.1-8.3 ARM64.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {*} Returns the "length" value.
+ */
+ var getLength = baseProperty('length');
+
+ /** Used as references for various `Number` constants. */
+ var MAX_SAFE_INTEGER = 9007199254740991;
+
+ /**
+ * Checks if `value` is a valid array-like length.
+ *
+ * **Note:** This function is loosely based on [`ToLength`](http://ecma-international.org/ecma-262/6.0/#sec-tolength).
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.
+ * @example
+ *
+ * _.isLength(3);
+ * // => true
+ *
+ * _.isLength(Number.MIN_VALUE);
+ * // => false
+ *
+ * _.isLength(Infinity);
+ * // => false
+ *
+ * _.isLength('3');
+ * // => false
+ */
+ function isLength(value) {
+ return typeof value == 'number' &&
+ value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
+ }
- var iter = keyIterator(object);
- var key,
- completed = 0;
+ /**
+ * Checks if `value` is array-like. A value is considered array-like if it's
+ * not a function and has a `value.length` that's an integer greater than or
+ * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
+ * @example
+ *
+ * _.isArrayLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLike(document.body.children);
+ * // => true
+ *
+ * _.isArrayLike('abc');
+ * // => true
+ *
+ * _.isArrayLike(_.noop);
+ * // => false
+ */
+ function isArrayLike(value) {
+ return value != null && isLength(getLength(value)) && !isFunction(value);
+ }
+
+ /** Used for built-in method references. */
+ var objectProto$1 = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty = objectProto$1.hasOwnProperty;
+
+ /** Built-in value references. */
+ var getPrototypeOf = Object.getPrototypeOf;
+
+ /**
+ * The base implementation of `_.has` without support for deep paths.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array|string} key The key to check.
+ * @returns {boolean} Returns `true` if `key` exists, else `false`.
+ */
+ function baseHas(object, key) {
+ // Avoid a bug in IE 10-11 where objects with a [[Prototype]] of `null`,
+ // that are composed entirely of index properties, return `false` for
+ // `hasOwnProperty` checks of them.
+ return hasOwnProperty.call(object, key) ||
+ (typeof object == 'object' && key in object && getPrototypeOf(object) === null);
+ }
+
+ /* Built-in method references for those with the same name as other `lodash` methods. */
+ var nativeKeys = Object.keys;
+
+ /**
+ * The base implementation of `_.keys` which doesn't skip the constructor
+ * property of prototypes or treat sparse arrays as dense.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ */
+ function baseKeys(object) {
+ return nativeKeys(Object(object));
+ }
+
+ /**
+ * The base implementation of `_.times` without support for iteratee shorthands
+ * or max array length checks.
+ *
+ * @private
+ * @param {number} n The number of times to invoke `iteratee`.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the array of results.
+ */
+ function baseTimes(n, iteratee) {
+ var index = -1,
+ result = Array(n);
- while ((key = iter()) != null) {
- completed += 1;
- iterator(object[key], key, onlyOnce(done));
+ while (++index < n) {
+ result[index] = iteratee(index);
}
+ return result;
+ }
- if (completed === 0) callback(null);
+ /**
+ * Checks if `value` is object-like. A value is object-like if it's not `null`
+ * and has a `typeof` result of "object".
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is object-like, else `false`.
+ * @example
+ *
+ * _.isObjectLike({});
+ * // => true
+ *
+ * _.isObjectLike([1, 2, 3]);
+ * // => true
+ *
+ * _.isObjectLike(_.noop);
+ * // => false
+ *
+ * _.isObjectLike(null);
+ * // => false
+ */
+ function isObjectLike(value) {
+ return !!value && typeof value == 'object';
+ }
- function done(err) {
- completed--;
- if (err) {
- callback(err);
- }
- // Check key is null in case iterator isn't exhausted
- // and done resolved synchronously.
- else if (key === null && completed <= 0) {
- callback(null);
- }
+ /**
+ * This method is like `_.isArrayLike` except that it also checks if `value`
+ * is an object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is an array-like object, else `false`.
+ * @example
+ *
+ * _.isArrayLikeObject([1, 2, 3]);
+ * // => true
+ *
+ * _.isArrayLikeObject(document.body.children);
+ * // => true
+ *
+ * _.isArrayLikeObject('abc');
+ * // => false
+ *
+ * _.isArrayLikeObject(_.noop);
+ * // => false
+ */
+ function isArrayLikeObject(value) {
+ return isObjectLike(value) && isArrayLike(value);
+ }
+
+ /** `Object#toString` result references. */
+ var argsTag = '[object Arguments]';
+
+ /** Used for built-in method references. */
+ var objectProto$2 = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty$1 = objectProto$2.hasOwnProperty;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objectToString$1 = objectProto$2.toString;
+
+ /** Built-in value references. */
+ var propertyIsEnumerable = objectProto$2.propertyIsEnumerable;
+
+ /**
+ * Checks if `value` is likely an `arguments` object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isArguments(function() { return arguments; }());
+ * // => true
+ *
+ * _.isArguments([1, 2, 3]);
+ * // => false
+ */
+ function isArguments(value) {
+ // Safari 8.1 incorrectly makes `arguments.callee` enumerable in strict mode.
+ return isArrayLikeObject(value) && hasOwnProperty$1.call(value, 'callee') &&
+ (!propertyIsEnumerable.call(value, 'callee') || objectToString$1.call(value) == argsTag);
+ }
+
+ /**
+ * Checks if `value` is classified as an `Array` object.
+ *
+ * @static
+ * @memberOf _
+ * @type {Function}
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isArray([1, 2, 3]);
+ * // => true
+ *
+ * _.isArray(document.body.children);
+ * // => false
+ *
+ * _.isArray('abc');
+ * // => false
+ *
+ * _.isArray(_.noop);
+ * // => false
+ */
+ var isArray = Array.isArray;
+
+ /** `Object#toString` result references. */
+ var stringTag = '[object String]';
+
+ /** Used for built-in method references. */
+ var objectProto$3 = Object.prototype;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objectToString$2 = objectProto$3.toString;
+
+ /**
+ * Checks if `value` is classified as a `String` primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isString('abc');
+ * // => true
+ *
+ * _.isString(1);
+ * // => false
+ */
+ function isString(value) {
+ return typeof value == 'string' ||
+ (!isArray(value) && isObjectLike(value) && objectToString$2.call(value) == stringTag);
+ }
+
+ /**
+ * Creates an array of index keys for `object` values of arrays,
+ * `arguments` objects, and strings, otherwise `null` is returned.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array|null} Returns index keys, else `null`.
+ */
+ function indexKeys(object) {
+ var length = object ? object.length : undefined;
+ if (isLength(length) &&
+ (isArray(object) || isString(object) || isArguments(object))) {
+ return baseTimes(length, String);
}
- }
+ return null;
+ }
- var applyEach = applyEach$1(eachOf);
+ /** Used as references for various `Number` constants. */
+ var MAX_SAFE_INTEGER$1 = 9007199254740991;
+
+ /** Used to detect unsigned integer values. */
+ var reIsUint = /^(?:0|[1-9]\d*)$/;
+
+ /**
+ * Checks if `value` is a valid array-like index.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.
+ * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.
+ */
+ function isIndex(value, length) {
+ value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;
+ length = length == null ? MAX_SAFE_INTEGER$1 : length;
+ return value > -1 && value % 1 == 0 && value < length;
+ }
- var _setImmediate = typeof setImmediate === 'function' && setImmediate;
+ /** Used for built-in method references. */
+ var objectProto$4 = Object.prototype;
+
+ /**
+ * Checks if `value` is likely a prototype object.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
+ */
+ function isPrototype(value) {
+ var Ctor = value && value.constructor,
+ proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$4;
+
+ return value === proto;
+ }
- var _delay;
- if (_setImmediate) {
- _delay = function (fn) {
- // not a direct alias for IE10 compatibility
- _setImmediate(fn);
- };
- } else if (typeof process === 'object' && typeof process.nextTick === 'function') {
- _delay = process.nextTick;
- } else {
- _delay = function (fn) {
- setTimeout(fn, 0);
- };
- }
+ /**
+ * Creates an array of the own enumerable property names of `object`.
+ *
+ * **Note:** Non-object values are coerced to objects. See the
+ * [ES spec](http://ecma-international.org/ecma-262/6.0/#sec-object.keys)
+ * for more details.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of property names.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.keys(new Foo);
+ * // => ['a', 'b'] (iteration order is not guaranteed)
+ *
+ * _.keys('hi');
+ * // => ['0', '1']
+ */
+ function keys(object) {
+ var isProto = isPrototype(object);
+ if (!(isProto || isArrayLike(object))) {
+ return baseKeys(object);
+ }
+ var indexes = indexKeys(object),
+ skipIndexes = !!indexes,
+ result = indexes || [],
+ length = result.length;
+
+ for (var key in object) {
+ if (baseHas(object, key) &&
+ !(skipIndexes && (key == 'length' || isIndex(key, length))) &&
+ !(isProto && key == 'constructor')) {
+ result.push(key);
+ }
+ }
+ return result;
+ }
- var setImmediate$1 = _delay;
+ function keyIterator(coll) {
+ var i = -1;
+ var len;
+ if (isArrayLike(coll)) {
+ len = coll.length;
+ return function next() {
+ i++;
+ return i < len ? i : null;
+ };
+ } else {
+ var okeys = keys(coll);
+ len = okeys.length;
+ return function next() {
+ i++;
+ return i < len ? okeys[i] : null;
+ };
+ }
+ }
- function eachOfSeries(obj, iterator, callback) {
- callback = once(callback || noop);
- obj = obj || [];
- var nextKey = keyIterator(obj);
- var key = nextKey();
+ function onlyOnce(fn) {
+ return function () {
+ if (fn === null) throw new Error("Callback was already called.");
+ fn.apply(this, arguments);
+ fn = null;
+ };
+ }
- function iterate() {
- var sync = true;
- if (key === null) {
- return callback(null);
- }
- iterator(obj[key], key, onlyOnce(function (err) {
- if (err) {
- callback(err);
- } else {
- key = nextKey();
- if (key === null) {
- return callback(null);
- } else {
- if (sync) {
- setImmediate$1(iterate);
- } else {
- iterate();
- }
- }
- }
- }));
- sync = false;
+ function _eachOfLimit(limit) {
+ return function (obj, iterator, callback) {
+ callback = once(callback || noop);
+ obj = obj || [];
+ var nextKey = keyIterator(obj);
+ if (limit <= 0) {
+ return callback(null);
+ }
+ var done = false;
+ var running = 0;
+ var errored = false;
+
+ (function replenish() {
+ if (done && running <= 0) {
+ return callback(null);
+ }
+
+ while (running < limit && !errored) {
+ var key = nextKey();
+ if (key === null) {
+ done = true;
+ if (running <= 0) {
+ callback(null);
+ }
+ return;
+ }
+ running += 1;
+ iterator(obj[key], key, onlyOnce(function (err) {
+ running -= 1;
+ if (err) {
+ callback(err);
+ errored = true;
+ } else {
+ replenish();
+ }
+ }));
+ }
+ })();
+ };
+ }
+
+ function eachOfLimit(obj, limit, iterator, cb) {
+ _eachOfLimit(limit)(obj, iterator, cb);
+ }
+
+ function doLimit(fn, limit) {
+ return function (iterable, iterator, callback) {
+ return fn(iterable, limit, iterator, callback);
+ };
+ }
+
+ var eachOf = doLimit(eachOfLimit, Infinity);
+
+ var applyEach = applyEach$1(eachOf);
+
+ var eachOfSeries = doLimit(eachOfLimit, 1);
+
+ var applyEachSeries = applyEach$1(eachOfSeries);
+
+ var apply$1 = rest(function (fn, args) {
+ return rest(function (callArgs) {
+ return fn.apply(null, args.concat(callArgs));
+ });
+ });
+
+ function asyncify(func) {
+ return rest(function (args) {
+ var callback = args.pop();
+ var result;
+ try {
+ result = func.apply(this, args);
+ } catch (e) {
+ return callback(e);
+ }
+ // if result is Promise object
+ if (isObject(result) && typeof result.then === 'function') {
+ result.then(function (value) {
+ callback(null, value);
+ })['catch'](function (err) {
+ callback(err.message ? err : new Error(err));
+ });
+ } else {
+ callback(null, result);
+ }
+ });
+ }
+
+ /**
+ * A specialized version of `_.forEach` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns `array`.
+ */
+ function arrayEach(array, iteratee) {
+ var index = -1,
+ length = array.length;
+
+ while (++index < length) {
+ if (iteratee(array[index], index, array) === false) {
+ break;
+ }
}
- iterate();
- }
+ return array;
+ }
- var applyEachSeries = applyEach$1(eachOfSeries);
+ /**
+ * This method returns the first argument given to it.
+ *
+ * @static
+ * @memberOf _
+ * @category Util
+ * @param {*} value Any value.
+ * @returns {*} Returns `value`.
+ * @example
+ *
+ * var object = { 'user': 'fred' };
+ *
+ * _.identity(object) === object;
+ * // => true
+ */
+ function identity(value) {
+ return value;
+ }
- var apply = rest(function (fn, args) {
- return rest(function (callArgs) {
- return fn.apply(null, args.concat(callArgs));
- });
- });
-
- function asyncify(func) {
- return rest(function (args) {
- var callback = args.pop();
- var result;
- try {
- result = func.apply(this, args);
- } catch (e) {
- return callback(e);
- }
- // if result is Promise object
- if (isObject(result) && typeof result.then === 'function') {
- result.then(function (value) {
- callback(null, value);
- })['catch'](function (err) {
- callback(err.message ? err : new Error(err));
- });
- } else {
- callback(null, result);
+ /**
+ * Casts `value` to `identity` if it's not a function.
+ *
+ * @private
+ * @param {*} value The value to inspect.
+ * @returns {Array} Returns the array-like object.
+ */
+ function baseCastFunction(value) {
+ return typeof value == 'function' ? value : identity;
+ }
+
+ /**
+ * Creates a base function for methods like `_.forIn`.
+ *
+ * @private
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
+ function createBaseFor(fromRight) {
+ return function(object, iteratee, keysFunc) {
+ var index = -1,
+ iterable = Object(object),
+ props = keysFunc(object),
+ length = props.length;
+
+ while (length--) {
+ var key = props[fromRight ? length : ++index];
+ if (iteratee(iterable[key], key, iterable) === false) {
+ break;
}
- });
- }
-
- /**
- * A specialized version of `_.forEach` for arrays without support for
- * iteratee shorthands.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns `array`.
- */
- function arrayEach(array, iteratee) {
- var index = -1,
- length = array.length;
-
- while (++index < length) {
- if (iteratee(array[index], index, array) === false) {
- break;
+ }
+ return object;
+ };
+ }
+
+ /**
+ * The base implementation of `baseForIn` and `baseForOwn` which iterates
+ * over `object` properties returned by `keysFunc` invoking `iteratee` for
+ * each property. Iteratee functions may exit iteration early by explicitly
+ * returning `false`.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {Function} keysFunc The function to get the keys of `object`.
+ * @returns {Object} Returns `object`.
+ */
+ var baseFor = createBaseFor();
+
+ /**
+ * The base implementation of `_.forOwn` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Object} object The object to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ */
+ function baseForOwn(object, iteratee) {
+ return object && baseFor(object, iteratee, keys);
+ }
+
+ /**
+ * Iterates over own enumerable properties of an object invoking `iteratee`
+ * for each property. The iteratee is invoked with three arguments:
+ * (value, key, object). Iteratee functions may exit iteration early by
+ * explicitly returning `false`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Object} Returns `object`.
+ * @example
+ *
+ * function Foo() {
+ * this.a = 1;
+ * this.b = 2;
+ * }
+ *
+ * Foo.prototype.c = 3;
+ *
+ * _.forOwn(new Foo, function(value, key) {
+ * console.log(key);
+ * });
+ * // => logs 'a' then 'b' (iteration order is not guaranteed)
+ */
+ function forOwn(object, iteratee) {
+ return object && baseForOwn(object, baseCastFunction(iteratee));
+ }
+
+ /**
+ * Gets the index at which the first occurrence of `NaN` is found in `array`.
+ *
+ * @private
+ * @param {Array} array The array to search.
+ * @param {number} fromIndex The index to search from.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {number} Returns the index of the matched `NaN`, else `-1`.
+ */
+ function indexOfNaN(array, fromIndex, fromRight) {
+ var length = array.length,
+ index = fromIndex + (fromRight ? 0 : -1);
+
+ while ((fromRight ? index-- : ++index < length)) {
+ var other = array[index];
+ if (other !== other) {
+ return index;
+ }
}
+ return -1;
}
- return array;
- }
-
- /**
- * A specialized version of `_.every` for arrays without support for
- * iteratee shorthands.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} predicate The function invoked per iteration.
- * @returns {boolean} Returns `true` if all elements pass the predicate check, else `false`.
- */
- function arrayEvery(array, predicate) {
- var index = -1,
- length = array.length;
-
- while (++index < length) {
- if (!predicate(array[index], index, array)) {
- return false;
+
+ /**
+ * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
+ *
+ * @private
+ * @param {Array} array The array to search.
+ * @param {*} value The value to search for.
+ * @param {number} fromIndex The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+ function baseIndexOf(array, value, fromIndex) {
+ if (value !== value) {
+ return indexOfNaN(array, fromIndex);
}
+ var index = fromIndex - 1,
+ length = array.length;
+
+ while (++index < length) {
+ if (array[index] === value) {
+ return index;
+ }
+ }
+ return -1;
+ }
+
+ /* Built-in method references for those with the same name as other `lodash` methods. */
+ var nativeMax$1 = Math.max;
+
+ /**
+ * Gets the index at which the first occurrence of `value` is found in `array`
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons. If `fromIndex` is negative, it's used as the offset
+ * from the end of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to search.
+ * @param {*} value The value to search for.
+ * @param {number} [fromIndex=0] The index to search from.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ * @example
+ *
+ * _.indexOf([1, 2, 1, 2], 2);
+ * // => 1
+ *
+ * // Search from the `fromIndex`.
+ * _.indexOf([1, 2, 1, 2], 2, 2);
+ * // => 3
+ */
+ function indexOf(array, value, fromIndex) {
+ var length = array ? array.length : 0;
+ if (!length) {
+ return -1;
+ }
+ fromIndex = toInteger(fromIndex);
+ if (fromIndex < 0) {
+ fromIndex = nativeMax$1(length + fromIndex, 0);
+ }
+ return baseIndexOf(array, value, fromIndex);
}
- return true;
- }
-
- /**
- * Creates a base function for methods like `_.forIn`.
- *
- * @private
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Function} Returns the new base function.
- */
- function createBaseFor(fromRight) {
- return function(object, iteratee, keysFunc) {
+
+ function auto (tasks, concurrency, callback) {
+ if (typeof concurrency === 'function') {
+ // concurrency is optional, shift the args.
+ callback = concurrency;
+ concurrency = null;
+ }
+ callback = once(callback || noop);
+ var keys$$ = keys(tasks);
+ var numTasks = keys$$.length;
+ if (!numTasks) {
+ return callback(null);
+ }
+ if (!concurrency) {
+ concurrency = numTasks;
+ }
+
+ var results = {};
+ var runningTasks = 0;
+ var hasError = false;
+
+ var listeners = {};
+
+ var readyTasks = [];
+
+ forOwn(tasks, function (task, key) {
+ if (!isArray(task)) {
+ // no dependencies
+ enqueueTask(key, [task]);
+ return;
+ }
+
+ var dependencies = task.slice(0, task.length - 1);
+ var remainingDependencies = dependencies.length;
+
+ checkForDeadlocks();
+
+ function checkForDeadlocks() {
+ var len = dependencies.length;
+ var dep;
+ while (len--) {
+ if (!(dep = tasks[dependencies[len]])) {
+ throw new Error('async.auto task `' + key + '` has non-existent dependency in ' + dependencies.join(', '));
+ }
+ if (isArray(dep) && indexOf(dep, key) >= 0) {
+ throw new Error('async.auto task `' + key + '`Has cyclic dependencies');
+ }
+ }
+ }
+
+ arrayEach(dependencies, function (dependencyName) {
+ addListener(dependencyName, function () {
+ remainingDependencies--;
+ if (remainingDependencies === 0) {
+ enqueueTask(key, task);
+ }
+ });
+ });
+ });
+
+ processQueue();
+
+ function enqueueTask(key, task) {
+ readyTasks.push(function () {
+ runTask(key, task);
+ });
+ }
+
+ function processQueue() {
+ if (readyTasks.length === 0 && runningTasks === 0) {
+ return callback(null, results);
+ }
+ while (readyTasks.length && runningTasks < concurrency) {
+ var run = readyTasks.shift();
+ run();
+ }
+ }
+
+ function addListener(taskName, fn) {
+ var taskListeners = listeners[taskName];
+ if (!taskListeners) {
+ taskListeners = listeners[taskName] = [];
+ }
+
+ taskListeners.push(fn);
+ }
+
+ function taskComplete(taskName) {
+ var taskListeners = listeners[taskName] || [];
+ arrayEach(taskListeners, function (fn) {
+ fn();
+ });
+ processQueue();
+ }
+
+ function runTask(key, task) {
+ if (hasError) return;
+
+ var taskCallback = onlyOnce(rest(function (err, args) {
+ runningTasks--;
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ if (err) {
+ var safeResults = {};
+ forOwn(results, function (val, rkey) {
+ safeResults[rkey] = val;
+ });
+ safeResults[key] = args;
+ hasError = true;
+ listeners = [];
+
+ callback(err, safeResults);
+ } else {
+ results[key] = args;
+ taskComplete(key);
+ }
+ }));
+
+ runningTasks++;
+ var taskFn = task[task.length - 1];
+ if (task.length > 1) {
+ taskFn(results, taskCallback);
+ } else {
+ taskFn(taskCallback);
+ }
+ }
+ }
+
+ /**
+ * A specialized version of `_.map` for arrays without support for iteratee
+ * shorthands.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array} Returns the new mapped array.
+ */
+ function arrayMap(array, iteratee) {
var index = -1,
- iterable = Object(object),
- props = keysFunc(object),
- length = props.length;
+ length = array.length,
+ result = Array(length);
+ while (++index < length) {
+ result[index] = iteratee(array[index], index, array);
+ }
+ return result;
+ }
+
+ /**
+ * Removes all key-value entries from the stack.
+ *
+ * @private
+ * @name clear
+ * @memberOf Stack
+ */
+ function stackClear() {
+ this.__data__ = { 'array': [], 'map': null };
+ }
+
+ /**
+ * Performs a [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * comparison between two values to determine if they are equivalent.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to compare.
+ * @param {*} other The other value to compare.
+ * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
+ * @example
+ *
+ * var object = { 'user': 'fred' };
+ * var other = { 'user': 'fred' };
+ *
+ * _.eq(object, object);
+ * // => true
+ *
+ * _.eq(object, other);
+ * // => false
+ *
+ * _.eq('a', 'a');
+ * // => true
+ *
+ * _.eq('a', Object('a'));
+ * // => false
+ *
+ * _.eq(NaN, NaN);
+ * // => true
+ */
+ function eq(value, other) {
+ return value === other || (value !== value && other !== other);
+ }
+
+ /**
+ * Gets the index at which the first occurrence of `key` is found in `array`
+ * of key-value pairs.
+ *
+ * @private
+ * @param {Array} array The array to search.
+ * @param {*} key The key to search for.
+ * @returns {number} Returns the index of the matched value, else `-1`.
+ */
+ function assocIndexOf(array, key) {
+ var length = array.length;
while (length--) {
- var key = props[fromRight ? length : ++index];
- if (iteratee(iterable[key], key, iterable) === false) {
- break;
+ if (eq(array[length][0], key)) {
+ return length;
}
}
- return object;
- };
- }
-
- /**
- * The base implementation of `baseForIn` and `baseForOwn` which iterates
- * over `object` properties returned by `keysFunc` invoking `iteratee` for
- * each property. Iteratee functions may exit iteration early by explicitly
- * returning `false`.
- *
- * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @param {Function} keysFunc The function to get the keys of `object`.
- * @returns {Object} Returns `object`.
- */
- var baseFor = createBaseFor();
-
- /**
- * The base implementation of `_.forOwn` without support for iteratee shorthands.
- *
- * @private
- * @param {Object} object The object to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Object} Returns `object`.
- */
- function baseForOwn(object, iteratee) {
- return object && baseFor(object, iteratee, keys);
- }
-
- /**
- * This method returns the first argument given to it.
- *
- * @static
- * @memberOf _
- * @category Util
- * @param {*} value Any value.
- * @returns {*} Returns `value`.
- * @example
- *
- * var object = { 'user': 'fred' };
- *
- * _.identity(object) === object;
- * // => true
- */
- function identity(value) {
- return value;
- }
-
- /**
- * Converts `value` to a function if it's not one.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {Function} Returns the function.
- */
- function toFunction(value) {
- return typeof value == 'function' ? value : identity;
- }
-
- /**
- * Iterates over own enumerable properties of an object invoking `iteratee`
- * for each property. The iteratee is invoked with three arguments:
- * (value, key, object). Iteratee functions may exit iteration early by
- * explicitly returning `false`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to iterate over.
- * @param {Function} [iteratee=_.identity] The function invoked per iteration.
- * @returns {Object} Returns `object`.
- * @example
- *
- * function Foo() {
- * this.a = 1;
- * this.b = 2;
- * }
- *
- * Foo.prototype.c = 3;
- *
- * _.forOwn(new Foo, function(value, key) {
- * console.log(key);
- * });
- * // => logs 'a' then 'b' (iteration order is not guaranteed)
- */
- function forOwn(object, iteratee) {
- return object && baseForOwn(object, toFunction(iteratee));
- }
-
- /**
- * Gets the index at which the first occurrence of `NaN` is found in `array`.
- *
- * @private
- * @param {Array} array The array to search.
- * @param {number} fromIndex The index to search from.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {number} Returns the index of the matched `NaN`, else `-1`.
- */
- function indexOfNaN(array, fromIndex, fromRight) {
- var length = array.length,
- index = fromIndex + (fromRight ? 0 : -1);
-
- while ((fromRight ? index-- : ++index < length)) {
- var other = array[index];
- if (other !== other) {
- return index;
+ return -1;
+ }
+
+ /** Used for built-in method references. */
+ var arrayProto = Array.prototype;
+
+ /** Built-in value references. */
+ var splice = arrayProto.splice;
+
+ /**
+ * Removes `key` and its value from the associative array.
+ *
+ * @private
+ * @param {Array} array The array to query.
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+ function assocDelete(array, key) {
+ var index = assocIndexOf(array, key);
+ if (index < 0) {
+ return false;
+ }
+ var lastIndex = array.length - 1;
+ if (index == lastIndex) {
+ array.pop();
+ } else {
+ splice.call(array, index, 1);
}
+ return true;
}
- return -1;
- }
-
- /**
- * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
- *
- * @private
- * @param {Array} array The array to search.
- * @param {*} value The value to search for.
- * @param {number} fromIndex The index to search from.
- * @returns {number} Returns the index of the matched value, else `-1`.
- */
- function baseIndexOf(array, value, fromIndex) {
- if (value !== value) {
- return indexOfNaN(array, fromIndex);
- }
- var index = fromIndex - 1,
- length = array.length;
-
- while (++index < length) {
- if (array[index] === value) {
- return index;
+
+ /**
+ * Removes `key` and its value from the stack.
+ *
+ * @private
+ * @name delete
+ * @memberOf Stack
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+ function stackDelete(key) {
+ var data = this.__data__,
+ array = data.array;
+
+ return array ? assocDelete(array, key) : data.map['delete'](key);
+ }
+
+ /**
+ * Gets the associative array value for `key`.
+ *
+ * @private
+ * @param {Array} array The array to query.
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+ function assocGet(array, key) {
+ var index = assocIndexOf(array, key);
+ return index < 0 ? undefined : array[index][1];
+ }
+
+ /**
+ * Gets the stack value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf Stack
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+ function stackGet(key) {
+ var data = this.__data__,
+ array = data.array;
+
+ return array ? assocGet(array, key) : data.map.get(key);
+ }
+
+ /**
+ * Checks if an associative array value for `key` exists.
+ *
+ * @private
+ * @param {Array} array The array to query.
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+ function assocHas(array, key) {
+ return assocIndexOf(array, key) > -1;
+ }
+
+ /**
+ * Checks if a stack value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf Stack
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+ function stackHas(key) {
+ var data = this.__data__,
+ array = data.array;
+
+ return array ? assocHas(array, key) : data.map.has(key);
+ }
+
+ /**
+ * Checks if `value` is a host object in IE < 9.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a host object, else `false`.
+ */
+ function isHostObject(value) {
+ // Many host objects are `Object` objects that can coerce to strings
+ // despite having improperly defined `toString` methods.
+ var result = false;
+ if (value != null && typeof value.toString != 'function') {
+ try {
+ result = !!(value + '');
+ } catch (e) {}
}
+ return result;
}
- return -1;
- }
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeMax$1 = Math.max;
-
- /**
- * Gets the index at which the first occurrence of `value` is found in `array`
- * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
- * for equality comparisons. If `fromIndex` is negative, it's used as the offset
- * from the end of `array`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to search.
- * @param {*} value The value to search for.
- * @param {number} [fromIndex=0] The index to search from.
- * @returns {number} Returns the index of the matched value, else `-1`.
- * @example
- *
- * _.indexOf([1, 2, 1, 2], 2);
- * // => 1
- *
- * // Search from the `fromIndex`.
- * _.indexOf([1, 2, 1, 2], 2, 2);
- * // => 3
- */
- function indexOf(array, value, fromIndex) {
- var length = array ? array.length : 0;
- if (!length) {
- return -1;
+
+ /** Used to match `RegExp` [syntax characters](http://ecma-international.org/ecma-262/6.0/#sec-patterns). */
+ var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;
+
+ /** Used to detect host constructors (Safari > 5). */
+ var reIsHostCtor = /^\[object .+?Constructor\]$/;
+
+ /** Used for built-in method references. */
+ var objectProto$6 = Object.prototype;
+
+ /** Used to resolve the decompiled source of functions. */
+ var funcToString = Function.prototype.toString;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty$2 = objectProto$6.hasOwnProperty;
+
+ /** Used to detect if a method is native. */
+ var reIsNative = RegExp('^' +
+ funcToString.call(hasOwnProperty$2).replace(reRegExpChar, '\\$&')
+ .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$'
+ );
+
+ /**
+ * Checks if `value` is a native function.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a native function, else `false`.
+ * @example
+ *
+ * _.isNative(Array.prototype.push);
+ * // => true
+ *
+ * _.isNative(_);
+ * // => false
+ */
+ function isNative(value) {
+ if (value == null) {
+ return false;
+ }
+ if (isFunction(value)) {
+ return reIsNative.test(funcToString.call(value));
+ }
+ return isObjectLike(value) &&
+ (isHostObject(value) ? reIsNative : reIsHostCtor).test(value);
}
- fromIndex = toInteger(fromIndex);
- if (fromIndex < 0) {
- fromIndex = nativeMax$1(length + fromIndex, 0);
+
+ /**
+ * Gets the native function at `key` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {string} key The key of the method to get.
+ * @returns {*} Returns the function if it's native, else `undefined`.
+ */
+ function getNative(object, key) {
+ var value = object[key];
+ return isNative(value) ? value : undefined;
+ }
+
+ /* Built-in method references that are verified to be native. */
+ var nativeCreate = getNative(Object, 'create');
+
+ /** Used for built-in method references. */
+ var objectProto$5 = Object.prototype;
+
+ /**
+ * Creates an hash object.
+ *
+ * @private
+ * @constructor
+ * @returns {Object} Returns the new hash object.
+ */
+ function Hash() {}
+
+ // Avoid inheriting from `Object.prototype` when possible.
+ Hash.prototype = nativeCreate ? nativeCreate(null) : objectProto$5;
+
+ /**
+ * Checks if `value` is a global object.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {null|Object} Returns `value` if it's a global object, else `null`.
+ */
+ function checkGlobal(value) {
+ return (value && value.Object === Object) ? value : null;
+ }
+
+ /** Used to determine if values are of the language type `Object`. */
+ var objectTypes = {
+ 'function': true,
+ 'object': true
+ };
+
+ /** Detect free variable `exports`. */
+ var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType)
+ ? exports
+ : undefined;
+
+ /** Detect free variable `module`. */
+ var freeModule = (objectTypes[typeof module] && module && !module.nodeType)
+ ? module
+ : undefined;
+
+ /** Detect free variable `global` from Node.js. */
+ var freeGlobal = checkGlobal(freeExports && freeModule && typeof global == 'object' && global);
+
+ /** Detect free variable `self`. */
+ var freeSelf = checkGlobal(objectTypes[typeof self] && self);
+
+ /** Detect free variable `window`. */
+ var freeWindow = checkGlobal(objectTypes[typeof window] && window);
+
+ /** Detect `this` as the global object. */
+ var thisGlobal = checkGlobal(objectTypes[typeof this] && this);
+
+ /**
+ * Used as a reference to the global object.
+ *
+ * The `this` value is used if it's the global object to avoid Greasemonkey's
+ * restricted `window` object, otherwise the `window` object is used.
+ */
+ var root = freeGlobal ||
+ ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) ||
+ freeSelf || thisGlobal || Function('return this')();
+
+ /* Built-in method references that are verified to be native. */
+ var Map = getNative(root, 'Map');
+
+ /**
+ * Removes all key-value entries from the map.
+ *
+ * @private
+ * @name clear
+ * @memberOf MapCache
+ */
+ function mapClear() {
+ this.__data__ = {
+ 'hash': new Hash,
+ 'map': Map ? new Map : [],
+ 'string': new Hash
+ };
}
- return baseIndexOf(array, value, fromIndex);
- }
- function auto (tasks, concurrency, callback) {
- if (typeof arguments[1] === 'function') {
- // concurrency is optional, shift the args.
- callback = concurrency;
- concurrency = null;
+ /** Used for built-in method references. */
+ var objectProto$7 = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty$3 = objectProto$7.hasOwnProperty;
+
+ /**
+ * Checks if a hash value for `key` exists.
+ *
+ * @private
+ * @param {Object} hash The hash to query.
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+ function hashHas(hash, key) {
+ return nativeCreate ? hash[key] !== undefined : hasOwnProperty$3.call(hash, key);
+ }
+
+ /**
+ * Removes `key` and its value from the hash.
+ *
+ * @private
+ * @param {Object} hash The hash to modify.
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+ function hashDelete(hash, key) {
+ return hashHas(hash, key) && delete hash[key];
+ }
+
+ /**
+ * Checks if `value` is suitable for use as unique object key.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is suitable, else `false`.
+ */
+ function isKeyable(value) {
+ var type = typeof value;
+ return type == 'number' || type == 'boolean' ||
+ (type == 'string' && value != '__proto__') || value == null;
+ }
+
+ /**
+ * Removes `key` and its value from the map.
+ *
+ * @private
+ * @name delete
+ * @memberOf MapCache
+ * @param {string} key The key of the value to remove.
+ * @returns {boolean} Returns `true` if the entry was removed, else `false`.
+ */
+ function mapDelete(key) {
+ var data = this.__data__;
+ if (isKeyable(key)) {
+ return hashDelete(typeof key == 'string' ? data.string : data.hash, key);
}
- callback = once(callback || noop);
- var keys$$ = keys(tasks);
- var remainingTasks = keys$$.length;
- if (!remainingTasks) {
- return callback(null);
+ return Map ? data.map['delete'](key) : assocDelete(data.map, key);
+ }
+
+ /** Used to stand-in for `undefined` hash values. */
+ var HASH_UNDEFINED = '__lodash_hash_undefined__';
+
+ /** Used for built-in method references. */
+ var objectProto$8 = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty$4 = objectProto$8.hasOwnProperty;
+
+ /**
+ * Gets the hash value for `key`.
+ *
+ * @private
+ * @param {Object} hash The hash to query.
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+ function hashGet(hash, key) {
+ if (nativeCreate) {
+ var result = hash[key];
+ return result === HASH_UNDEFINED ? undefined : result;
}
- if (!concurrency) {
- concurrency = remainingTasks;
+ return hasOwnProperty$4.call(hash, key) ? hash[key] : undefined;
+ }
+
+ /**
+ * Gets the map value for `key`.
+ *
+ * @private
+ * @name get
+ * @memberOf MapCache
+ * @param {string} key The key of the value to get.
+ * @returns {*} Returns the entry value.
+ */
+ function mapGet(key) {
+ var data = this.__data__;
+ if (isKeyable(key)) {
+ return hashGet(typeof key == 'string' ? data.string : data.hash, key);
}
+ return Map ? data.map.get(key) : assocGet(data.map, key);
+ }
- var results = {};
- var runningTasks = 0;
- var hasError = false;
+ /**
+ * Checks if a map value for `key` exists.
+ *
+ * @private
+ * @name has
+ * @memberOf MapCache
+ * @param {string} key The key of the entry to check.
+ * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
+ */
+ function mapHas(key) {
+ var data = this.__data__;
+ if (isKeyable(key)) {
+ return hashHas(typeof key == 'string' ? data.string : data.hash, key);
+ }
+ return Map ? data.map.has(key) : assocHas(data.map, key);
+ }
- var listeners = [];
- function addListener(fn) {
- listeners.unshift(fn);
+ /**
+ * Sets the associative array `key` to `value`.
+ *
+ * @private
+ * @param {Array} array The array to modify.
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ */
+ function assocSet(array, key, value) {
+ var index = assocIndexOf(array, key);
+ if (index < 0) {
+ array.push([key, value]);
+ } else {
+ array[index][1] = value;
}
- function removeListener(fn) {
- var idx = indexOf(listeners, fn);
- if (idx >= 0) listeners.splice(idx, 1);
+ }
+
+ /** Used to stand-in for `undefined` hash values. */
+ var HASH_UNDEFINED$1 = '__lodash_hash_undefined__';
+
+ /**
+ * Sets the hash `key` to `value`.
+ *
+ * @private
+ * @param {Object} hash The hash to modify.
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ */
+ function hashSet(hash, key, value) {
+ hash[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED$1 : value;
+ }
+
+ /**
+ * Sets the map `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf MapCache
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the map cache object.
+ */
+ function mapSet(key, value) {
+ var data = this.__data__;
+ if (isKeyable(key)) {
+ hashSet(typeof key == 'string' ? data.string : data.hash, key, value);
+ } else if (Map) {
+ data.map.set(key, value);
+ } else {
+ assocSet(data.map, key, value);
}
- function taskComplete() {
- remainingTasks--;
- arrayEach(listeners.slice(), function (fn) {
- fn();
- });
+ return this;
+ }
+
+ /**
+ * Creates a map cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [values] The values to cache.
+ */
+ function MapCache(values) {
+ var index = -1,
+ length = values ? values.length : 0;
+
+ this.clear();
+ while (++index < length) {
+ var entry = values[index];
+ this.set(entry[0], entry[1]);
}
+ }
- addListener(function () {
- if (!remainingTasks) {
- callback(null, results);
- }
- });
+ // Add functions to the `MapCache`.
+ MapCache.prototype.clear = mapClear;
+ MapCache.prototype['delete'] = mapDelete;
+ MapCache.prototype.get = mapGet;
+ MapCache.prototype.has = mapHas;
+ MapCache.prototype.set = mapSet;
+
+ /** Used as the size to enable large array optimizations. */
+ var LARGE_ARRAY_SIZE = 200;
+
+ /**
+ * Sets the stack `key` to `value`.
+ *
+ * @private
+ * @name set
+ * @memberOf Stack
+ * @param {string} key The key of the value to set.
+ * @param {*} value The value to set.
+ * @returns {Object} Returns the stack cache object.
+ */
+ function stackSet(key, value) {
+ var data = this.__data__,
+ array = data.array;
+
+ if (array) {
+ if (array.length < (LARGE_ARRAY_SIZE - 1)) {
+ assocSet(array, key, value);
+ } else {
+ data.array = null;
+ data.map = new MapCache(array);
+ }
+ }
+ var map = data.map;
+ if (map) {
+ map.set(key, value);
+ }
+ return this;
+ }
- arrayEach(keys$$, function (k) {
- if (hasError) return;
- var task = isArray(tasks[k]) ? tasks[k] : [tasks[k]];
- var taskCallback = rest(function (err, args) {
- runningTasks--;
- if (args.length <= 1) {
- args = args[0];
- }
- if (err) {
- var safeResults = {};
- forOwn(results, function (val, rkey) {
- safeResults[rkey] = val;
- });
- safeResults[k] = args;
- hasError = true;
-
- callback(err, safeResults);
- } else {
- results[k] = args;
- setImmediate$1(taskComplete);
- }
- });
- var requires = task.slice(0, task.length - 1);
- // prevent dead-locks
- var len = requires.length;
- var dep;
- while (len--) {
- if (!(dep = tasks[requires[len]])) {
- throw new Error('Has non-existent dependency in ' + requires.join(', '));
- }
- if (isArray(dep) && indexOf(dep, k) >= 0) {
- throw new Error('Has cyclic dependencies');
- }
- }
- function ready() {
- return runningTasks < concurrency && !baseHas(results, k) && arrayEvery(requires, function (x) {
- return baseHas(results, x);
- });
- }
- if (ready()) {
- runningTasks++;
- task[task.length - 1](taskCallback, results);
- } else {
- addListener(listener);
- }
- function listener() {
- if (ready()) {
- runningTasks++;
- removeListener(listener);
- task[task.length - 1](taskCallback, results);
- }
- }
- });
- }
-
- /**
- * A specialized version of `_.map` for arrays without support for iteratee
- * shorthands.
- *
- * @private
- * @param {Array} array The array to iterate over.
- * @param {Function} iteratee The function invoked per iteration.
- * @returns {Array} Returns the new mapped array.
- */
- function arrayMap(array, iteratee) {
- var index = -1,
- length = array.length,
- result = Array(length);
-
- while (++index < length) {
- result[index] = iteratee(array[index], index, array);
- }
- return result;
- }
-
- function queue$1(worker, concurrency, payload) {
- if (concurrency == null) {
- concurrency = 1;
- } else if (concurrency === 0) {
- throw new Error('Concurrency must not be zero');
+ /**
+ * Creates a stack cache object to store key-value pairs.
+ *
+ * @private
+ * @constructor
+ * @param {Array} [values] The values to cache.
+ */
+ function Stack(values) {
+ var index = -1,
+ length = values ? values.length : 0;
+
+ this.clear();
+ while (++index < length) {
+ var entry = values[index];
+ this.set(entry[0], entry[1]);
}
- function _insert(q, data, pos, callback) {
- if (callback != null && typeof callback !== 'function') {
- throw new Error('task callback must be a function');
- }
- q.started = true;
- if (!isArray(data)) {
- data = [data];
- }
- if (data.length === 0 && q.idle()) {
- // call drain immediately if there are no tasks
- return setImmediate$1(function () {
- q.drain();
- });
- }
- arrayEach(data, function (task) {
- var item = {
- data: task,
- callback: callback || noop
- };
-
- if (pos) {
- q.tasks.unshift(item);
- } else {
- q.tasks.push(item);
- }
-
- if (q.tasks.length === q.concurrency) {
- q.saturated();
- }
- });
- setImmediate$1(q.process);
+ }
+
+ // Add functions to the `Stack` cache.
+ Stack.prototype.clear = stackClear;
+ Stack.prototype['delete'] = stackDelete;
+ Stack.prototype.get = stackGet;
+ Stack.prototype.has = stackHas;
+ Stack.prototype.set = stackSet;
+
+ /** Used for built-in method references. */
+ var objectProto$9 = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty$5 = objectProto$9.hasOwnProperty;
+
+ /**
+ * Assigns `value` to `key` of `object` if the existing value is not equivalent
+ * using [`SameValueZero`](http://ecma-international.org/ecma-262/6.0/#sec-samevaluezero)
+ * for equality comparisons.
+ *
+ * @private
+ * @param {Object} object The object to modify.
+ * @param {string} key The key of the property to assign.
+ * @param {*} value The value to assign.
+ */
+ function assignValue(object, key, value) {
+ var objValue = object[key];
+ if (!(hasOwnProperty$5.call(object, key) && eq(objValue, value)) ||
+ (value === undefined && !(key in object))) {
+ object[key] = value;
+ }
+ }
+
+ /**
+ * This function is like `copyObject` except that it accepts a function to
+ * customize copied values.
+ *
+ * @private
+ * @param {Object} source The object to copy properties from.
+ * @param {Array} props The property names to copy.
+ * @param {Object} [object={}] The object to copy properties to.
+ * @param {Function} [customizer] The function to customize copied values.
+ * @returns {Object} Returns `object`.
+ */
+ function copyObjectWith(source, props, object, customizer) {
+ object || (object = {});
+
+ var index = -1,
+ length = props.length;
+
+ while (++index < length) {
+ var key = props[index];
+
+ var newValue = customizer
+ ? customizer(object[key], source[key], key, object, source)
+ : source[key];
+
+ assignValue(object, key, newValue);
}
- function _next(q, tasks) {
- return function () {
- workers -= 1;
-
- var removed = false;
- var args = arguments;
- arrayEach(tasks, function (task) {
- arrayEach(workersList, function (worker, index) {
- if (worker === task && !removed) {
- workersList.splice(index, 1);
- removed = true;
- }
- });
-
- task.callback.apply(task, args);
- });
- if (q.tasks.length + workers === 0) {
- q.drain();
- }
- q.process();
- };
+ return object;
+ }
+
+ /**
+ * Copies properties of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy properties from.
+ * @param {Array} props The property names to copy.
+ * @param {Object} [object={}] The object to copy properties to.
+ * @returns {Object} Returns `object`.
+ */
+ function copyObject(source, props, object) {
+ return copyObjectWith(source, props, object);
+ }
+
+ /**
+ * The base implementation of `_.assign` without support for multiple sources
+ * or `customizer` functions.
+ *
+ * @private
+ * @param {Object} object The destination object.
+ * @param {Object} source The source object.
+ * @returns {Object} Returns `object`.
+ */
+ function baseAssign(object, source) {
+ return object && copyObject(source, keys(source), object);
+ }
+
+ /**
+ * Creates a clone of `buffer`.
+ *
+ * @private
+ * @param {Buffer} buffer The buffer to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Buffer} Returns the cloned buffer.
+ */
+ function cloneBuffer(buffer, isDeep) {
+ if (isDeep) {
+ return buffer.slice();
}
+ var result = new buffer.constructor(buffer.length);
+ buffer.copy(result);
+ return result;
+ }
+
+ /**
+ * Copies the values of `source` to `array`.
+ *
+ * @private
+ * @param {Array} source The array to copy values from.
+ * @param {Array} [array=[]] The array to copy values to.
+ * @returns {Array} Returns `array`.
+ */
+ function copyArray(source, array) {
+ var index = -1,
+ length = source.length;
- var workers = 0;
- var workersList = [];
- var q = {
- tasks: [],
- concurrency: concurrency,
- payload: payload,
- saturated: noop,
- empty: noop,
- drain: noop,
- started: false,
- paused: false,
- push: function (data, callback) {
- _insert(q, data, false, callback);
- },
- kill: function () {
- q.drain = noop;
- q.tasks = [];
- },
- unshift: function (data, callback) {
- _insert(q, data, true, callback);
- },
- process: function () {
- while (!q.paused && workers < q.concurrency && q.tasks.length) {
-
- var tasks = q.payload ? q.tasks.splice(0, q.payload) : q.tasks.splice(0, q.tasks.length);
-
- var data = arrayMap(tasks, baseProperty('data'));
-
- if (q.tasks.length === 0) {
- q.empty();
- }
- workers += 1;
- workersList.push(tasks[0]);
- var cb = onlyOnce(_next(q, tasks));
- worker(data, cb);
- }
- },
- length: function () {
- return q.tasks.length;
- },
- running: function () {
- return workers;
- },
- workersList: function () {
- return workersList;
- },
- idle: function () {
- return q.tasks.length + workers === 0;
- },
- pause: function () {
- q.paused = true;
- },
- resume: function () {
- if (q.paused === false) {
- return;
- }
- q.paused = false;
- var resumeCount = Math.min(q.concurrency, q.tasks.length);
- // Need to call q.process once per concurrent
- // worker to preserve full concurrency after pause
- for (var w = 1; w <= resumeCount; w++) {
- setImmediate$1(q.process);
- }
+ array || (array = Array(length));
+ while (++index < length) {
+ array[index] = source[index];
+ }
+ return array;
+ }
+
+ /** Built-in value references. */
+ var getOwnPropertySymbols = Object.getOwnPropertySymbols;
+
+ /**
+ * Creates an array of the own symbol properties of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @returns {Array} Returns the array of symbols.
+ */
+ var getSymbols = getOwnPropertySymbols || function() {
+ return [];
+ };
+
+ /**
+ * Copies own symbol properties of `source` to `object`.
+ *
+ * @private
+ * @param {Object} source The object to copy symbols from.
+ * @param {Object} [object={}] The object to copy symbols to.
+ * @returns {Object} Returns `object`.
+ */
+ function copySymbols(source, object) {
+ return copyObject(source, getSymbols(source), object);
+ }
+
+ /* Built-in method references that are verified to be native. */
+ var Set = getNative(root, 'Set');
+
+ /* Built-in method references that are verified to be native. */
+ var WeakMap = getNative(root, 'WeakMap');
+
+ var mapTag$1 = '[object Map]';
+ var objectTag$1 = '[object Object]';
+ var setTag$1 = '[object Set]';
+ var weakMapTag$1 = '[object WeakMap]';
+ /** Used for built-in method references. */
+ var objectProto$10 = Object.prototype;
+
+ /** Used to resolve the decompiled source of functions. */
+ var funcToString$1 = Function.prototype.toString;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objectToString$3 = objectProto$10.toString;
+
+ /** Used to detect maps, sets, and weakmaps. */
+ var mapCtorString = Map ? funcToString$1.call(Map) : '';
+ var setCtorString = Set ? funcToString$1.call(Set) : '';
+ var weakMapCtorString = WeakMap ? funcToString$1.call(WeakMap) : '';
+ /**
+ * Gets the `toStringTag` of `value`.
+ *
+ * @private
+ * @param {*} value The value to query.
+ * @returns {string} Returns the `toStringTag`.
+ */
+ function getTag(value) {
+ return objectToString$3.call(value);
+ }
+
+ // Fallback for IE 11 providing `toStringTag` values for maps, sets, and weakmaps.
+ if ((Map && getTag(new Map) != mapTag$1) ||
+ (Set && getTag(new Set) != setTag$1) ||
+ (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
+ getTag = function(value) {
+ var result = objectToString$3.call(value),
+ Ctor = result == objectTag$1 ? value.constructor : null,
+ ctorString = typeof Ctor == 'function' ? funcToString$1.call(Ctor) : '';
+
+ if (ctorString) {
+ switch (ctorString) {
+ case mapCtorString: return mapTag$1;
+ case setCtorString: return setTag$1;
+ case weakMapCtorString: return weakMapTag$1;
}
+ }
+ return result;
};
- return q;
- }
-
- function cargo(worker, payload) {
- return queue$1(worker, 1, payload);
- }
-
- function reduce(arr, memo, iterator, cb) {
- eachOfSeries(arr, function (x, i, cb) {
- iterator(memo, x, function (err, v) {
- memo = v;
- cb(err);
- });
- }, function (err) {
- cb(err, memo);
- });
- }
-
- function seq() /* functions... */{
- var fns = arguments;
- return rest(function (args) {
- var that = this;
-
- var cb = args[args.length - 1];
- if (typeof cb == 'function') {
- args.pop();
- } else {
- cb = noop;
- }
+ }
- reduce(fns, args, function (newargs, fn, cb) {
- fn.apply(that, newargs.concat([rest(function (err, nextargs) {
- cb(err, nextargs);
- })]));
- }, function (err, results) {
- cb.apply(that, [err].concat(results));
- });
+ var getTag$1 = getTag;
+
+ /** Used for built-in method references. */
+ var objectProto$11 = Object.prototype;
+
+ /** Used to check objects for own properties. */
+ var hasOwnProperty$6 = objectProto$11.hasOwnProperty;
+
+ /**
+ * Initializes an array clone.
+ *
+ * @private
+ * @param {Array} array The array to clone.
+ * @returns {Array} Returns the initialized clone.
+ */
+ function initCloneArray(array) {
+ var length = array.length,
+ result = array.constructor(length);
+
+ // Add properties assigned by `RegExp#exec`.
+ if (length && typeof array[0] == 'string' && hasOwnProperty$6.call(array, 'index')) {
+ result.index = array.index;
+ result.input = array.input;
+ }
+ return result;
+ }
+
+ /** Built-in value references. */
+ var Uint8Array = root.Uint8Array;
+
+ /**
+ * Creates a clone of `arrayBuffer`.
+ *
+ * @private
+ * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
+ * @returns {ArrayBuffer} Returns the cloned array buffer.
+ */
+ function cloneArrayBuffer(arrayBuffer) {
+ var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
+ new Uint8Array(result).set(new Uint8Array(arrayBuffer));
+ return result;
+ }
+
+ /**
+ * Adds the key-value `pair` to `map`.
+ *
+ * @private
+ * @param {Object} map The map to modify.
+ * @param {Array} pair The key-value pair to add.
+ * @returns {Object} Returns `map`.
+ */
+ function addMapEntry(map, pair) {
+ // Don't return `Map#set` because it doesn't return the map instance in IE 11.
+ map.set(pair[0], pair[1]);
+ return map;
+ }
+
+ /**
+ * A specialized version of `_.reduce` for arrays without support for
+ * iteratee shorthands.
+ *
+ * @private
+ * @param {Array} array The array to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @param {*} [accumulator] The initial value.
+ * @param {boolean} [initAccum] Specify using the first element of `array` as the initial value.
+ * @returns {*} Returns the accumulated value.
+ */
+ function arrayReduce(array, iteratee, accumulator, initAccum) {
+ var index = -1,
+ length = array.length;
+
+ if (initAccum && length) {
+ accumulator = array[++index];
+ }
+ while (++index < length) {
+ accumulator = iteratee(accumulator, array[index], index, array);
+ }
+ return accumulator;
+ }
+
+ /**
+ * Converts `map` to an array.
+ *
+ * @private
+ * @param {Object} map The map to convert.
+ * @returns {Array} Returns the converted array.
+ */
+ function mapToArray(map) {
+ var index = -1,
+ result = Array(map.size);
+
+ map.forEach(function(value, key) {
+ result[++index] = [key, value];
});
- }
+ return result;
+ }
- var reverse = Array.prototype.reverse;
+ /**
+ * Creates a clone of `map`.
+ *
+ * @private
+ * @param {Object} map The map to clone.
+ * @returns {Object} Returns the cloned map.
+ */
+ function cloneMap(map) {
+ return arrayReduce(mapToArray(map), addMapEntry, new map.constructor);
+ }
- function compose() /* functions... */{
- return seq.apply(null, reverse.call(arguments));
- }
+ /** Used to match `RegExp` flags from their coerced string values. */
+ var reFlags = /\w*$/;
+
+ /**
+ * Creates a clone of `regexp`.
+ *
+ * @private
+ * @param {Object} regexp The regexp to clone.
+ * @returns {Object} Returns the cloned regexp.
+ */
+ function cloneRegExp(regexp) {
+ var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
+ result.lastIndex = regexp.lastIndex;
+ return result;
+ }
- function concat$1(eachfn, arr, fn, callback) {
- var result = [];
- eachfn(arr, function (x, index, cb) {
- fn(x, function (err, y) {
- result = result.concat(y || []);
- cb(err);
- });
- }, function (err) {
- callback(err, result);
+ /**
+ * Adds `value` to `set`.
+ *
+ * @private
+ * @param {Object} set The set to modify.
+ * @param {*} value The value to add.
+ * @returns {Object} Returns `set`.
+ */
+ function addSetEntry(set, value) {
+ set.add(value);
+ return set;
+ }
+
+ /**
+ * Converts `set` to an array.
+ *
+ * @private
+ * @param {Object} set The set to convert.
+ * @returns {Array} Returns the converted array.
+ */
+ function setToArray(set) {
+ var index = -1,
+ result = Array(set.size);
+
+ set.forEach(function(value) {
+ result[++index] = value;
});
- }
+ return result;
+ }
- function doParallel(fn) {
- return function (obj, iterator, callback) {
- return fn(eachOf, obj, iterator, callback);
- };
- }
+ /**
+ * Creates a clone of `set`.
+ *
+ * @private
+ * @param {Object} set The set to clone.
+ * @returns {Object} Returns the cloned set.
+ */
+ function cloneSet(set) {
+ return arrayReduce(setToArray(set), addSetEntry, new set.constructor);
+ }
- var concat = doParallel(concat$1);
+ /** Built-in value references. */
+ var Symbol = root.Symbol;
+
+ var symbolProto = Symbol ? Symbol.prototype : undefined;
+ var symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
+ /**
+ * Creates a clone of the `symbol` object.
+ *
+ * @private
+ * @param {Object} symbol The symbol object to clone.
+ * @returns {Object} Returns the cloned symbol object.
+ */
+ function cloneSymbol(symbol) {
+ return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
+ }
- function doSeries(fn) {
- return function (obj, iterator, callback) {
- return fn(eachOfSeries, obj, iterator, callback);
- };
- }
+ /**
+ * Creates a clone of `typedArray`.
+ *
+ * @private
+ * @param {Object} typedArray The typed array to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the cloned typed array.
+ */
+ function cloneTypedArray(typedArray, isDeep) {
+ var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
+ return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
+ }
- var concatSeries = doSeries(concat$1);
+ var boolTag$1 = '[object Boolean]';
+ var dateTag$1 = '[object Date]';
+ var mapTag$2 = '[object Map]';
+ var numberTag$1 = '[object Number]';
+ var regexpTag$1 = '[object RegExp]';
+ var setTag$2 = '[object Set]';
+ var stringTag$2 = '[object String]';
+ var symbolTag$1 = '[object Symbol]';
+ var arrayBufferTag$1 = '[object ArrayBuffer]';
+ var float32Tag$1 = '[object Float32Array]';
+ var float64Tag$1 = '[object Float64Array]';
+ var int8Tag$1 = '[object Int8Array]';
+ var int16Tag$1 = '[object Int16Array]';
+ var int32Tag$1 = '[object Int32Array]';
+ var uint8Tag$1 = '[object Uint8Array]';
+ var uint8ClampedTag$1 = '[object Uint8ClampedArray]';
+ var uint16Tag$1 = '[object Uint16Array]';
+ var uint32Tag$1 = '[object Uint32Array]';
+ /**
+ * Initializes an object clone based on its `toStringTag`.
+ *
+ * **Note:** This function only supports cloning values with tags of
+ * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @param {string} tag The `toStringTag` of the object to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @returns {Object} Returns the initialized clone.
+ */
+ function initCloneByTag(object, tag, isDeep) {
+ var Ctor = object.constructor;
+ switch (tag) {
+ case arrayBufferTag$1:
+ return cloneArrayBuffer(object);
+
+ case boolTag$1:
+ case dateTag$1:
+ return new Ctor(+object);
+
+ case float32Tag$1: case float64Tag$1:
+ case int8Tag$1: case int16Tag$1: case int32Tag$1:
+ case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
+ return cloneTypedArray(object, isDeep);
+
+ case mapTag$2:
+ return cloneMap(object);
+
+ case numberTag$1:
+ case stringTag$2:
+ return new Ctor(object);
+
+ case regexpTag$1:
+ return cloneRegExp(object);
+
+ case setTag$2:
+ return cloneSet(object);
+
+ case symbolTag$1:
+ return cloneSymbol(object);
+ }
+ }
- var constant = rest(function (values) {
- var args = [null].concat(values);
- return function (cb) {
- return cb.apply(this, args);
+ /** Built-in value references. */
+ var objectCreate = Object.create;
+
+ /**
+ * The base implementation of `_.create` without support for assigning
+ * properties to the created object.
+ *
+ * @private
+ * @param {Object} prototype The object to inherit from.
+ * @returns {Object} Returns the new object.
+ */
+ function baseCreate(proto) {
+ return isObject(proto) ? objectCreate(proto) : {};
+ }
+
+ /** Built-in value references. */
+ var getPrototypeOf$1 = Object.getPrototypeOf;
+
+ /**
+ * Initializes an object clone.
+ *
+ * @private
+ * @param {Object} object The object to clone.
+ * @returns {Object} Returns the initialized clone.
+ */
+ function initCloneObject(object) {
+ return (typeof object.constructor == 'function' && !isPrototype(object))
+ ? baseCreate(getPrototypeOf$1(object))
+ : {};
+ }
+
+ /**
+ * Creates a function that returns `value`.
+ *
+ * @static
+ * @memberOf _
+ * @category Util
+ * @param {*} value The value to return from the new function.
+ * @returns {Function} Returns the new function.
+ * @example
+ *
+ * var object = { 'user': 'fred' };
+ * var getter = _.constant(object);
+ *
+ * getter() === object;
+ * // => true
+ */
+ function constant(value) {
+ return function() {
+ return value;
};
- });
-
- function _createTester(eachfn, check, getResult) {
- return function (arr, limit, iterator, cb) {
- function done(err) {
- if (cb) {
- if (err) {
- cb(err);
- } else {
- cb(null, getResult(false, void 0));
- }
- }
+ }
+
+ /** Used to determine if values are of the language type `Object`. */
+ var objectTypes$1 = {
+ 'function': true,
+ 'object': true
+ };
+
+ /** Detect free variable `exports`. */
+ var freeExports$1 = (objectTypes$1[typeof exports] && exports && !exports.nodeType)
+ ? exports
+ : undefined;
+
+ /** Detect free variable `module`. */
+ var freeModule$1 = (objectTypes$1[typeof module] && module && !module.nodeType)
+ ? module
+ : undefined;
+
+ /** Detect the popular CommonJS extension `module.exports`. */
+ var moduleExports = (freeModule$1 && freeModule$1.exports === freeExports$1)
+ ? freeExports$1
+ : undefined;
+
+ /** Built-in value references. */
+ var Buffer = moduleExports ? root.Buffer : undefined;
+
+ /**
+ * Checks if `value` is a buffer.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.
+ * @example
+ *
+ * _.isBuffer(new Buffer(2));
+ * // => true
+ *
+ * _.isBuffer(new Uint8Array(2));
+ * // => false
+ */
+ var isBuffer = !Buffer ? constant(false) : function(value) {
+ return value instanceof Buffer;
+ };
+
+ var argsTag$1 = '[object Arguments]';
+ var arrayTag = '[object Array]';
+ var boolTag = '[object Boolean]';
+ var dateTag = '[object Date]';
+ var errorTag = '[object Error]';
+ var funcTag$1 = '[object Function]';
+ var genTag$1 = '[object GeneratorFunction]';
+ var mapTag = '[object Map]';
+ var numberTag = '[object Number]';
+ var objectTag = '[object Object]';
+ var regexpTag = '[object RegExp]';
+ var setTag = '[object Set]';
+ var stringTag$1 = '[object String]';
+ var symbolTag = '[object Symbol]';
+ var weakMapTag = '[object WeakMap]';
+ var arrayBufferTag = '[object ArrayBuffer]';
+ var float32Tag = '[object Float32Array]';
+ var float64Tag = '[object Float64Array]';
+ var int8Tag = '[object Int8Array]';
+ var int16Tag = '[object Int16Array]';
+ var int32Tag = '[object Int32Array]';
+ var uint8Tag = '[object Uint8Array]';
+ var uint8ClampedTag = '[object Uint8ClampedArray]';
+ var uint16Tag = '[object Uint16Array]';
+ var uint32Tag = '[object Uint32Array]';
+ /** Used to identify `toStringTag` values supported by `_.clone`. */
+ var cloneableTags = {};
+ cloneableTags[argsTag$1] = cloneableTags[arrayTag] =
+ cloneableTags[arrayBufferTag] = cloneableTags[boolTag] =
+ cloneableTags[dateTag] = cloneableTags[float32Tag] =
+ cloneableTags[float64Tag] = cloneableTags[int8Tag] =
+ cloneableTags[int16Tag] = cloneableTags[int32Tag] =
+ cloneableTags[mapTag] = cloneableTags[numberTag] =
+ cloneableTags[objectTag] = cloneableTags[regexpTag] =
+ cloneableTags[setTag] = cloneableTags[stringTag$1] =
+ cloneableTags[symbolTag] = cloneableTags[uint8Tag] =
+ cloneableTags[uint8ClampedTag] = cloneableTags[uint16Tag] =
+ cloneableTags[uint32Tag] = true;
+ cloneableTags[errorTag] = cloneableTags[funcTag$1] =
+ cloneableTags[weakMapTag] = false;
+
+ /**
+ * The base implementation of `_.clone` and `_.cloneDeep` which tracks
+ * traversed objects.
+ *
+ * @private
+ * @param {*} value The value to clone.
+ * @param {boolean} [isDeep] Specify a deep clone.
+ * @param {boolean} [isFull] Specify a clone including symbols.
+ * @param {Function} [customizer] The function to customize cloning.
+ * @param {string} [key] The key of `value`.
+ * @param {Object} [object] The parent object of `value`.
+ * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
+ * @returns {*} Returns the cloned value.
+ */
+ function baseClone(value, isDeep, isFull, customizer, key, object, stack) {
+ var result;
+ if (customizer) {
+ result = object ? customizer(value, key, object, stack) : customizer(value);
+ }
+ if (result !== undefined) {
+ return result;
+ }
+ if (!isObject(value)) {
+ return value;
+ }
+ var isArr = isArray(value);
+ if (isArr) {
+ result = initCloneArray(value);
+ if (!isDeep) {
+ return copyArray(value, result);
+ }
+ } else {
+ var tag = getTag$1(value),
+ isFunc = tag == funcTag$1 || tag == genTag$1;
+
+ if (isBuffer(value)) {
+ return cloneBuffer(value, isDeep);
+ }
+ if (tag == objectTag || tag == argsTag$1 || (isFunc && !object)) {
+ if (isHostObject(value)) {
+ return object ? value : {};
}
- function iteratee(x, _, callback) {
- if (!cb) return callback();
- iterator(x, function (err, v) {
- if (cb) {
- if (err) {
- cb(err);
- cb = iterator = false;
- } else if (check(v)) {
- cb(null, getResult(true, x));
- cb = iterator = false;
- }
- }
- callback();
- });
+ result = initCloneObject(isFunc ? {} : value);
+ if (!isDeep) {
+ result = baseAssign(result, value);
+ return isFull ? copySymbols(value, result) : result;
}
- if (arguments.length > 3) {
- eachfn(arr, limit, iteratee, done);
- } else {
- cb = iterator;
- iterator = limit;
- eachfn(arr, iteratee, done);
+ } else {
+ if (!cloneableTags[tag]) {
+ return object ? value : {};
}
- };
- }
+ result = initCloneByTag(value, tag, isDeep);
+ }
+ }
+ // Check for circular references and return its corresponding clone.
+ stack || (stack = new Stack);
+ var stacked = stack.get(value);
+ if (stacked) {
+ return stacked;
+ }
+ stack.set(value, result);
- function _findGetResult(v, x) {
- return x;
- }
+ // Recursively populate clone (susceptible to call stack limits).
+ (isArr ? arrayEach : baseForOwn)(value, function(subValue, key) {
+ assignValue(result, key, baseClone(subValue, isDeep, isFull, customizer, key, value, stack));
+ });
+ return (isFull && !isArr) ? copySymbols(value, result) : result;
+ }
- var detect = _createTester(eachOf, identity, _findGetResult);
+ var argsRegex = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
- function _eachOfLimit(limit) {
- return function (obj, iterator, callback) {
- callback = once(callback || noop);
- obj = obj || [];
- var nextKey = keyIterator(obj);
- if (limit <= 0) {
- return callback(null);
- }
- var done = false;
- var running = 0;
- var errored = false;
-
- (function replenish() {
- if (done && running <= 0) {
- return callback(null);
- }
-
- while (running < limit && !errored) {
- var key = nextKey();
- if (key === null) {
- done = true;
- if (running <= 0) {
- callback(null);
- }
- return;
- }
- running += 1;
- iterator(obj[key], key, onlyOnce(function (err) {
- running -= 1;
- if (err) {
- callback(err);
- errored = true;
- } else {
- replenish();
- }
- }));
- }
- })();
- };
- }
-
- function eachOfLimit(obj, limit, iterator, cb) {
- _eachOfLimit(limit)(obj, iterator, cb);
- }
-
- var detectLimit = _createTester(eachOfLimit, identity, _findGetResult);
-
- var detectSeries = _createTester(eachOfSeries, identity, _findGetResult);
-
- function consoleFunc(name) {
- return rest(function (fn, args) {
- fn.apply(null, args.concat([rest(function (err, args) {
- if (typeof console === 'object') {
- if (err) {
- if (console.error) {
- console.error(err);
- }
- } else if (console[name]) {
- arrayEach(args, function (x) {
- console[name](x);
- });
- }
- }
- })]));
- });
- }
+ function parseParams(func) {
+ return func.toString().match(argsRegex)[1].split(/\s*\,\s*/);
+ }
- var dir = consoleFunc('dir');
+ function autoInject(tasks, callback) {
+ var newTasks = {};
+
+ forOwn(tasks, function (taskFn, key) {
+ var params;
+
+ if (isArray(taskFn)) {
+ params = baseClone(taskFn);
+ taskFn = params.pop();
+
+ newTasks[key] = params.concat(newTask);
+ } else if (taskFn.length === 0) {
+ throw new Error("autoInject task functions require explicit parameters.");
+ } else if (taskFn.length === 1) {
+ // no dependencies, use the function as-is
+ newTasks[key] = taskFn;
+ } else {
+ params = parseParams(taskFn);
+ params.pop();
+
+ newTasks[key] = params.concat(newTask);
+ }
+
+ function newTask(results, taskCb) {
+ var newArgs = arrayMap(params, function (name) {
+ return results[name];
+ });
+ newArgs.push(taskCb);
+ taskFn.apply(null, newArgs);
+ }
+ });
+
+ auto(newTasks, callback);
+ }
- function during(test, iterator, cb) {
- cb = cb || noop;
+ var _setImmediate = typeof setImmediate === 'function' && setImmediate;
+
+ var _defer;
+ if (_setImmediate) {
+ _defer = _setImmediate;
+ } else if (typeof process === 'object' && typeof process.nextTick === 'function') {
+ _defer = process.nextTick;
+ } else {
+ _defer = function (fn) {
+ setTimeout(fn, 0);
+ };
+ }
- var next = rest(function (err, args) {
- if (err) {
- cb(err);
- } else {
- args.push(check);
- test.apply(this, args);
- }
- });
+ var setImmediate$1 = rest(function (fn, args) {
+ _defer(function () {
+ fn.apply(null, args);
+ });
+ });
- var check = function (err, truth) {
- if (err) return cb(err);
- if (!truth) return cb(null);
- iterator(next);
- };
+ function queue(worker, concurrency, payload) {
+ if (concurrency == null) {
+ concurrency = 1;
+ } else if (concurrency === 0) {
+ throw new Error('Concurrency must not be zero');
+ }
+ function _insert(q, data, pos, callback) {
+ if (callback != null && typeof callback !== 'function') {
+ throw new Error('task callback must be a function');
+ }
+ q.started = true;
+ if (!isArray(data)) {
+ data = [data];
+ }
+ if (data.length === 0 && q.idle()) {
+ // call drain immediately if there are no tasks
+ return setImmediate$1(function () {
+ q.drain();
+ });
+ }
+ arrayEach(data, function (task) {
+ var item = {
+ data: task,
+ callback: callback || noop
+ };
+
+ if (pos) {
+ q.tasks.unshift(item);
+ } else {
+ q.tasks.push(item);
+ }
+
+ if (q.tasks.length === q.concurrency) {
+ q.saturated();
+ }
+ if (q.tasks.length <= q.concurrency - q.buffer) {
+ q.unsaturated();
+ }
+ });
+ setImmediate$1(q.process);
+ }
+ function _next(q, tasks) {
+ return function () {
+ workers -= 1;
+
+ var removed = false;
+ var args = arguments;
+ arrayEach(tasks, function (task) {
+ arrayEach(workersList, function (worker, index) {
+ if (worker === task && !removed) {
+ workersList.splice(index, 1);
+ removed = true;
+ }
+ });
+
+ task.callback.apply(task, args);
+ });
+ if (q.tasks.length + workers === 0) {
+ q.drain();
+ }
+ q.process();
+ };
+ }
- test(check);
- }
-
- function doDuring(iterator, test, cb) {
- var calls = 0;
-
- during(function (next) {
- if (calls++ < 1) return next(null, true);
- test.apply(this, arguments);
- }, iterator, cb);
- }
-
- function whilst(test, iterator, cb) {
- cb = cb || noop;
- if (!test()) return cb(null);
- var next = rest(function (err, args) {
- if (err) return cb(err);
- if (test.apply(this, args)) return iterator(next);
- cb.apply(null, [null].concat(args));
- });
- iterator(next);
- }
-
- function doWhilst(iterator, test, cb) {
- var calls = 0;
- return whilst(function () {
- return ++calls <= 1 || test.apply(this, arguments);
- }, iterator, cb);
- }
-
- function doUntil(iterator, test, cb) {
- return doWhilst(iterator, function () {
- return !test.apply(this, arguments);
- }, cb);
- }
-
- function _withoutIndex(iterator) {
- return function (value, index, callback) {
- return iterator(value, callback);
- };
- }
-
- function each(arr, iterator, cb) {
- return eachOf(arr, _withoutIndex(iterator), cb);
- }
-
- function eachLimit(arr, limit, iterator, cb) {
- return _eachOfLimit(limit)(arr, _withoutIndex(iterator), cb);
- }
-
- function eachSeries(arr, iterator, cb) {
- return eachOfSeries(arr, _withoutIndex(iterator), cb);
- }
-
- function ensureAsync(fn) {
- return rest(function (args) {
- var callback = args.pop();
- var sync = true;
- args.push(function () {
- var innerArgs = arguments;
- if (sync) {
- setImmediate$1(function () {
- callback.apply(null, innerArgs);
- });
- } else {
- callback.apply(null, innerArgs);
- }
- });
- fn.apply(this, args);
- sync = false;
- });
- }
-
- function notId(v) {
- return !v;
- }
-
- var every = _createTester(eachOf, notId, notId);
-
- var everyLimit = _createTester(eachOfLimit, notId, notId);
-
- function _filter(eachfn, arr, iterator, callback) {
- var results = [];
- eachfn(arr, function (x, index, callback) {
- iterator(x, function (err, v) {
- if (err) {
- callback(err);
- } else {
- if (v) {
- results.push({ index: index, value: x });
- }
- callback();
- }
- });
- }, function (err) {
- if (err) {
- callback(err);
- } else {
- callback(null, arrayMap(results.sort(function (a, b) {
- return a.index - b.index;
- }), baseProperty('value')));
- }
- });
- }
+ var workers = 0;
+ var workersList = [];
+ var q = {
+ tasks: [],
+ concurrency: concurrency,
+ payload: payload,
+ saturated: noop,
+ unsaturated: noop,
+ buffer: concurrency / 4,
+ empty: noop,
+ drain: noop,
+ started: false,
+ paused: false,
+ push: function (data, callback) {
+ _insert(q, data, false, callback);
+ },
+ kill: function () {
+ q.drain = noop;
+ q.tasks = [];
+ },
+ unshift: function (data, callback) {
+ _insert(q, data, true, callback);
+ },
+ process: function () {
+ while (!q.paused && workers < q.concurrency && q.tasks.length) {
+
+ var tasks = q.payload ? q.tasks.splice(0, q.payload) : q.tasks.splice(0, q.tasks.length);
+
+ var data = arrayMap(tasks, baseProperty('data'));
+
+ if (q.tasks.length === 0) {
+ q.empty();
+ }
+ workers += 1;
+ workersList.push(tasks[0]);
+ var cb = onlyOnce(_next(q, tasks));
+ worker(data, cb);
+ }
+ },
+ length: function () {
+ return q.tasks.length;
+ },
+ running: function () {
+ return workers;
+ },
+ workersList: function () {
+ return workersList;
+ },
+ idle: function () {
+ return q.tasks.length + workers === 0;
+ },
+ pause: function () {
+ q.paused = true;
+ },
+ resume: function () {
+ if (q.paused === false) {
+ return;
+ }
+ q.paused = false;
+ var resumeCount = Math.min(q.concurrency, q.tasks.length);
+ // Need to call q.process once per concurrent
+ // worker to preserve full concurrency after pause
+ for (var w = 1; w <= resumeCount; w++) {
+ setImmediate$1(q.process);
+ }
+ }
+ };
+ return q;
+ }
- var filter = doParallel(_filter);
+ function cargo(worker, payload) {
+ return queue(worker, 1, payload);
+ }
- function doParallelLimit(fn) {
- return function (obj, limit, iterator, callback) {
- return fn(_eachOfLimit(limit), obj, iterator, callback);
- };
- }
+ function reduce(arr, memo, iterator, cb) {
+ eachOfSeries(arr, function (x, i, cb) {
+ iterator(memo, x, function (err, v) {
+ memo = v;
+ cb(err);
+ });
+ }, function (err) {
+ cb(err, memo);
+ });
+ }
+
+ function seq() /* functions... */{
+ var fns = arguments;
+ return rest(function (args) {
+ var that = this;
+
+ var cb = args[args.length - 1];
+ if (typeof cb == 'function') {
+ args.pop();
+ } else {
+ cb = noop;
+ }
+
+ reduce(fns, args, function (newargs, fn, cb) {
+ fn.apply(that, newargs.concat([rest(function (err, nextargs) {
+ cb(err, nextargs);
+ })]));
+ }, function (err, results) {
+ cb.apply(that, [err].concat(results));
+ });
+ });
+ }
+
+ var reverse = Array.prototype.reverse;
+
+ function compose() /* functions... */{
+ return seq.apply(null, reverse.call(arguments));
+ }
+
+ function concat$1(eachfn, arr, fn, callback) {
+ var result = [];
+ eachfn(arr, function (x, index, cb) {
+ fn(x, function (err, y) {
+ result = result.concat(y || []);
+ cb(err);
+ });
+ }, function (err) {
+ callback(err, result);
+ });
+ }
+
+ function doParallel(fn) {
+ return function (obj, iterator, callback) {
+ return fn(eachOf, obj, iterator, callback);
+ };
+ }
+
+ var concat = doParallel(concat$1);
+
+ function doSeries(fn) {
+ return function (obj, iterator, callback) {
+ return fn(eachOfSeries, obj, iterator, callback);
+ };
+ }
+
+ var concatSeries = doSeries(concat$1);
+
+ var constant$1 = rest(function (values) {
+ var args = [null].concat(values);
+ return function () {
+ var callback = [].slice.call(arguments).pop();
+ return callback.apply(this, args);
+ };
+ });
+
+ function _createTester(eachfn, check, getResult) {
+ return function (arr, limit, iterator, cb) {
+ function done(err) {
+ if (cb) {
+ if (err) {
+ cb(err);
+ } else {
+ cb(null, getResult(false));
+ }
+ }
+ }
+ function iteratee(x, _, callback) {
+ if (!cb) return callback();
+ iterator(x, function (err, v) {
+ if (cb) {
+ if (err) {
+ cb(err);
+ cb = iterator = false;
+ } else if (check(v)) {
+ cb(null, getResult(true, x));
+ cb = iterator = false;
+ }
+ }
+ callback();
+ });
+ }
+ if (arguments.length > 3) {
+ eachfn(arr, limit, iteratee, done);
+ } else {
+ cb = iterator;
+ iterator = limit;
+ eachfn(arr, iteratee, done);
+ }
+ };
+ }
+
+ function _findGetResult(v, x) {
+ return x;
+ }
+
+ var detect = _createTester(eachOf, identity, _findGetResult);
+
+ var detectLimit = _createTester(eachOfLimit, identity, _findGetResult);
+
+ var detectSeries = _createTester(eachOfSeries, identity, _findGetResult);
+
+ function consoleFunc(name) {
+ return rest(function (fn, args) {
+ fn.apply(null, args.concat([rest(function (err, args) {
+ if (typeof console === 'object') {
+ if (err) {
+ if (console.error) {
+ console.error(err);
+ }
+ } else if (console[name]) {
+ arrayEach(args, function (x) {
+ console[name](x);
+ });
+ }
+ }
+ })]));
+ });
+ }
- var filterLimit = doParallelLimit(_filter);
+ var dir = consoleFunc('dir');
- var filterSeries = doSeries(_filter);
+ function during(test, iterator, cb) {
+ cb = cb || noop;
- function forever(fn, cb) {
- var done = onlyOnce(cb || noop);
- var task = ensureAsync(fn);
+ var next = rest(function (err, args) {
+ if (err) {
+ cb(err);
+ } else {
+ args.push(check);
+ test.apply(this, args);
+ }
+ });
- function next(err) {
- if (err) return done(err);
- task(next);
+ var check = function (err, truth) {
+ if (err) return cb(err);
+ if (!truth) return cb(null);
+ iterator(next);
+ };
+
+ test(check);
+ }
+
+ function doDuring(iterator, test, cb) {
+ var calls = 0;
+
+ during(function (next) {
+ if (calls++ < 1) return next(null, true);
+ test.apply(this, arguments);
+ }, iterator, cb);
+ }
+
+ function whilst(test, iterator, cb) {
+ cb = cb || noop;
+ if (!test()) return cb(null);
+ var next = rest(function (err, args) {
+ if (err) return cb(err);
+ if (test.apply(this, args)) return iterator(next);
+ cb.apply(null, [null].concat(args));
+ });
+ iterator(next);
+ }
+
+ function doWhilst(iterator, test, cb) {
+ var calls = 0;
+ return whilst(function () {
+ return ++calls <= 1 || test.apply(this, arguments);
+ }, iterator, cb);
+ }
+
+ function doUntil(iterator, test, cb) {
+ return doWhilst(iterator, function () {
+ return !test.apply(this, arguments);
+ }, cb);
+ }
+
+ function _withoutIndex(iterator) {
+ return function (value, index, callback) {
+ return iterator(value, callback);
+ };
+ }
+
+ function eachLimit(arr, limit, iterator, cb) {
+ return _eachOfLimit(limit)(arr, _withoutIndex(iterator), cb);
+ }
+
+ var each = doLimit(eachLimit, Infinity);
+
+ var eachSeries = doLimit(eachLimit, 1);
+
+ function ensureAsync(fn) {
+ return rest(function (args) {
+ var callback = args.pop();
+ var sync = true;
+ args.push(function () {
+ var innerArgs = arguments;
+ if (sync) {
+ setImmediate$1(function () {
+ callback.apply(null, innerArgs);
+ });
+ } else {
+ callback.apply(null, innerArgs);
+ }
+ });
+ fn.apply(this, args);
+ sync = false;
+ });
+ }
+
+ function notId(v) {
+ return !v;
+ }
+
+ var everyLimit = _createTester(eachOfLimit, notId, notId);
+
+ var every = doLimit(everyLimit, Infinity);
+
+ var everySeries = doLimit(everyLimit, 1);
+
+ function _filter(eachfn, arr, iterator, callback) {
+ var results = [];
+ eachfn(arr, function (x, index, callback) {
+ iterator(x, function (err, v) {
+ if (err) {
+ callback(err);
+ } else {
+ if (v) {
+ results.push({ index: index, value: x });
+ }
+ callback();
+ }
+ });
+ }, function (err) {
+ if (err) {
+ callback(err);
+ } else {
+ callback(null, arrayMap(results.sort(function (a, b) {
+ return a.index - b.index;
+ }), baseProperty('value')));
+ }
+ });
+ }
+
+ function doParallelLimit(fn) {
+ return function (obj, limit, iterator, callback) {
+ return fn(_eachOfLimit(limit), obj, iterator, callback);
+ };
+ }
+
+ var filterLimit = doParallelLimit(_filter);
+
+ var filter = doLimit(filterLimit, Infinity);
+
+ var filterSeries = doLimit(filterLimit, 1);
+
+ function forever(fn, cb) {
+ var done = onlyOnce(cb || noop);
+ var task = ensureAsync(fn);
+
+ function next(err) {
+ if (err) return done(err);
+ task(next);
+ }
+ next();
+ }
+
+ function iterator (tasks) {
+ function makeCallback(index) {
+ function fn() {
+ if (tasks.length) {
+ tasks[index].apply(null, arguments);
+ }
+ return fn.next();
+ }
+ fn.next = function () {
+ return index < tasks.length - 1 ? makeCallback(index + 1) : null;
+ };
+ return fn;
+ }
+ return makeCallback(0);
+ }
+
+ var log = consoleFunc('log');
+
+ function _asyncMap(eachfn, arr, iterator, callback) {
+ callback = once(callback || noop);
+ arr = arr || [];
+ var results = isArrayLike(arr) ? [] : {};
+ eachfn(arr, function (value, index, callback) {
+ iterator(value, function (err, v) {
+ results[index] = v;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, results);
+ });
+ }
+
+ var mapLimit = doParallelLimit(_asyncMap);
+
+ var map = doLimit(mapLimit, Infinity);
+
+ var mapSeries = doLimit(mapLimit, 1);
+
+ /** `Object#toString` result references. */
+ var symbolTag$2 = '[object Symbol]';
+
+ /** Used for built-in method references. */
+ var objectProto$12 = Object.prototype;
+
+ /**
+ * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
+ * of values.
+ */
+ var objectToString$4 = objectProto$12.toString;
+
+ /**
+ * Checks if `value` is classified as a `Symbol` primitive or object.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to check.
+ * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
+ * @example
+ *
+ * _.isSymbol(Symbol.iterator);
+ * // => true
+ *
+ * _.isSymbol('abc');
+ * // => false
+ */
+ function isSymbol(value) {
+ return typeof value == 'symbol' ||
+ (isObjectLike(value) && objectToString$4.call(value) == symbolTag$2);
+ }
+
+ /** Used as references for various `Number` constants. */
+ var INFINITY$1 = 1 / 0;
+
+ /** Used to convert symbols to primitives and strings. */
+ var symbolProto$1 = Symbol ? Symbol.prototype : undefined;
+ var symbolToString = symbolProto$1 ? symbolProto$1.toString : undefined;
+ /**
+ * Converts `value` to a string if it's not one. An empty string is returned
+ * for `null` and `undefined` values. The sign of `-0` is preserved.
+ *
+ * @static
+ * @memberOf _
+ * @category Lang
+ * @param {*} value The value to process.
+ * @returns {string} Returns the string.
+ * @example
+ *
+ * _.toString(null);
+ * // => ''
+ *
+ * _.toString(-0);
+ * // => '-0'
+ *
+ * _.toString([1, 2, 3]);
+ * // => '1,2,3'
+ */
+ function toString(value) {
+ // Exit early for strings to avoid a performance hit in some environments.
+ if (typeof value == 'string') {
+ return value;
}
- next();
- }
-
- function iterator (tasks) {
- function makeCallback(index) {
- function fn() {
- if (tasks.length) {
- tasks[index].apply(null, arguments);
- }
- return fn.next();
- }
- fn.next = function () {
- return index < tasks.length - 1 ? makeCallback(index + 1) : null;
- };
- return fn;
+ if (value == null) {
+ return '';
+ }
+ if (isSymbol(value)) {
+ return symbolToString ? symbolToString.call(value) : '';
}
- return makeCallback(0);
- }
-
- var log = consoleFunc('log');
-
- function _asyncMap(eachfn, arr, iterator, callback) {
- callback = once(callback || noop);
- arr = arr || [];
- var results = isArrayLike(arr) ? [] : {};
- eachfn(arr, function (value, index, callback) {
- iterator(value, function (err, v) {
- results[index] = v;
- callback(err);
- });
- }, function (err) {
- callback(err, results);
+ var result = (value + '');
+ return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
+ }
+
+ /** Used to match property names within property paths. */
+ var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g;
+
+ /** Used to match backslashes in property paths. */
+ var reEscapeChar = /\\(\\)?/g;
+
+ /**
+ * Converts `string` to a property path array.
+ *
+ * @private
+ * @param {string} string The string to convert.
+ * @returns {Array} Returns the property path array.
+ */
+ function stringToPath(string) {
+ var result = [];
+ toString(string).replace(rePropName, function(match, number, quote, string) {
+ result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
});
- }
-
- var map = doParallel(_asyncMap);
-
- var mapLimit = doParallelLimit(_asyncMap);
-
- var mapSeries = doSeries(_asyncMap);
-
- /**
- * Checks if `value` is a global object.
- *
- * @private
- * @param {*} value The value to check.
- * @returns {null|Object} Returns `value` if it's a global object, else `null`.
- */
- function checkGlobal(value) {
- return (value && value.Object === Object) ? value : null;
- }
-
- /** Used to determine if values are of the language type `Object`. */
- var objectTypes = {
- 'function': true,
- 'object': true
- };
-
- /** Detect free variable `exports`. */
- var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType) ? exports : null;
-
- /** Detect free variable `module`. */
- var freeModule = (objectTypes[typeof module] && module && !module.nodeType) ? module : null;
-
- /** Detect free variable `global` from Node.js. */
- var freeGlobal = checkGlobal(freeExports && freeModule && typeof global == 'object' && global);
-
- /** Detect free variable `self`. */
- var freeSelf = checkGlobal(objectTypes[typeof self] && self);
-
- /** Detect free variable `window`. */
- var freeWindow = checkGlobal(objectTypes[typeof window] && window);
-
- /** Detect `this` as the global object. */
- var thisGlobal = checkGlobal(objectTypes[typeof this] && this);
-
- /**
- * Used as a reference to the global object.
- *
- * The `this` value is used if it's the global object to avoid Greasemonkey's
- * restricted `window` object, otherwise the `window` object is used.
- */
- var root = freeGlobal || ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) || freeSelf || thisGlobal || Function('return this')();
-
- /** Built-in value references. */
- var Symbol = root.Symbol;
-
- /** `Object#toString` result references. */
- var symbolTag = '[object Symbol]';
-
- /** Used for built-in method references. */
- var objectProto$5 = Object.prototype;
-
- /**
- * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)
- * of values.
- */
- var objectToString$3 = objectProto$5.toString;
-
- /**
- * Checks if `value` is classified as a `Symbol` primitive or object.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to check.
- * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.
- * @example
- *
- * _.isSymbol(Symbol.iterator);
- * // => true
- *
- * _.isSymbol('abc');
- * // => false
- */
- function isSymbol(value) {
- return typeof value == 'symbol' ||
- (isObjectLike(value) && objectToString$3.call(value) == symbolTag);
- }
-
- /** Used as references for various `Number` constants. */
- var INFINITY$1 = 1 / 0;
-
- /** Used to convert symbols to primitives and strings. */
- var symbolProto = Symbol ? Symbol.prototype : undefined;
- var symbolToString = Symbol ? symbolProto.toString : undefined;
- /**
- * Converts `value` to a string if it's not one. An empty string is returned
- * for `null` and `undefined` values. The sign of `-0` is preserved.
- *
- * @static
- * @memberOf _
- * @category Lang
- * @param {*} value The value to process.
- * @returns {string} Returns the string.
- * @example
- *
- * _.toString(null);
- * // => ''
- *
- * _.toString(-0);
- * // => '-0'
- *
- * _.toString([1, 2, 3]);
- * // => '1,2,3'
- */
- function toString(value) {
- // Exit early for strings to avoid a performance hit in some environments.
- if (typeof value == 'string') {
- return value;
+ return result;
}
- if (value == null) {
- return '';
- }
- if (isSymbol(value)) {
- return Symbol ? symbolToString.call(value) : '';
- }
- var result = (value + '');
- return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
- }
-
- /** Used to match property names within property paths. */
- var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g;
-
- /** Used to match backslashes in property paths. */
- var reEscapeChar = /\\(\\)?/g;
-
- /**
- * Converts `string` to a property path array.
- *
- * @private
- * @param {string} string The string to convert.
- * @returns {Array} Returns the property path array.
- */
- function stringToPath(string) {
- var result = [];
- toString(string).replace(rePropName, function(match, number, quote, string) {
- result.push(quote ? string.replace(reEscapeChar, '$1') : (number || match));
- });
- return result;
- }
-
- /**
- * The base implementation of `_.toPath` which only converts `value` to a
- * path if it's not one.
- *
- * @private
- * @param {*} value The value to process.
- * @returns {Array} Returns the property path array.
- */
- function baseToPath(value) {
- return isArray(value) ? value : stringToPath(value);
- }
-
- var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/;
- var reIsPlainProp = /^\w*$/;
- /**
- * Checks if `value` is a property name and not a property path.
- *
- * @private
- * @param {*} value The value to check.
- * @param {Object} [object] The object to query keys on.
- * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
- */
- function isKey(value, object) {
- if (typeof value == 'number') {
- return true;
+
+ /**
+ * Casts `value` to a path array if it's not one.
+ *
+ * @private
+ * @param {*} value The value to inspect.
+ * @returns {Array} Returns the cast property path array.
+ */
+ function baseCastPath(value) {
+ return isArray(value) ? value : stringToPath(value);
}
- return !isArray(value) &&
- (reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
- (object != null && value in Object(object)));
- }
-
- /**
- * Gets the last element of `array`.
- *
- * @static
- * @memberOf _
- * @category Array
- * @param {Array} array The array to query.
- * @returns {*} Returns the last element of `array`.
- * @example
- *
- * _.last([1, 2, 3]);
- * // => 3
- */
- function last(array) {
- var length = array ? array.length : 0;
- return length ? array[length - 1] : undefined;
- }
-
- /**
- * The base implementation of `_.slice` without an iteratee call guard.
- *
- * @private
- * @param {Array} array The array to slice.
- * @param {number} [start=0] The start position.
- * @param {number} [end=array.length] The end position.
- * @returns {Array} Returns the slice of `array`.
- */
- function baseSlice(array, start, end) {
- var index = -1,
- length = array.length;
-
- if (start < 0) {
- start = -start > length ? 0 : (length + start);
- }
- end = end > length ? length : end;
- if (end < 0) {
- end += length;
- }
- length = start > end ? 0 : ((end - start) >>> 0);
- start >>>= 0;
-
- var result = Array(length);
- while (++index < length) {
- result[index] = array[index + start];
- }
- return result;
- }
-
- /**
- * The base implementation of `_.get` without support for default values.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array|string} path The path of the property to get.
- * @returns {*} Returns the resolved value.
- */
- function baseGet(object, path) {
- path = isKey(path, object) ? [path + ''] : baseToPath(path);
-
- var index = 0,
- length = path.length;
-
- while (object != null && index < length) {
- object = object[path[index++]];
- }
- return (index && index == length) ? object : undefined;
- }
-
- /**
- * Gets the value at `path` of `object`. If the resolved value is
- * `undefined` the `defaultValue` is used in its place.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @param {Array|string} path The path of the property to get.
- * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
- * @returns {*} Returns the resolved value.
- * @example
- *
- * var object = { 'a': [{ 'b': { 'c': 3 } }] };
- *
- * _.get(object, 'a[0].b.c');
- * // => 3
- *
- * _.get(object, ['a', '0', 'b', 'c']);
- * // => 3
- *
- * _.get(object, 'a.b.c', 'default');
- * // => 'default'
- */
- function get(object, path, defaultValue) {
- var result = object == null ? undefined : baseGet(object, path);
- return result === undefined ? defaultValue : result;
- }
-
- /**
- * Gets the parent value at `path` of `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array} path The path to get the parent value of.
- * @returns {*} Returns the parent value.
- */
- function parent(object, path) {
- return path.length == 1 ? object : get(object, baseSlice(path, 0, -1));
- }
-
- /**
- * Checks if `path` exists on `object`.
- *
- * @private
- * @param {Object} object The object to query.
- * @param {Array|string} path The path to check.
- * @param {Function} hasFunc The function to check properties.
- * @returns {boolean} Returns `true` if `path` exists, else `false`.
- */
- function hasPath(object, path, hasFunc) {
- if (object == null) {
- return false;
- }
- var result = hasFunc(object, path);
- if (!result && !isKey(path)) {
- path = baseToPath(path);
- object = parent(object, path);
- if (object != null) {
- path = last(path);
- result = hasFunc(object, path);
+
+ var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/;
+ var reIsPlainProp = /^\w*$/;
+ /**
+ * Checks if `value` is a property name and not a property path.
+ *
+ * @private
+ * @param {*} value The value to check.
+ * @param {Object} [object] The object to query keys on.
+ * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
+ */
+ function isKey(value, object) {
+ if (typeof value == 'number') {
+ return true;
}
+ return !isArray(value) &&
+ (reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
+ (object != null && value in Object(object)));
}
- var length = object ? object.length : undefined;
- return result || (
- !!length && isLength(length) && isIndex(path, length) &&
- (isArray(object) || isString(object) || isArguments(object))
- );
- }
-
- /**
- * Checks if `path` is a direct property of `object`.
- *
- * @static
- * @memberOf _
- * @category Object
- * @param {Object} object The object to query.
- * @param {Array|string} path The path to check.
- * @returns {boolean} Returns `true` if `path` exists, else `false`.
- * @example
- *
- * var object = { 'a': { 'b': { 'c': 3 } } };
- * var other = _.create({ 'a': _.create({ 'b': _.create({ 'c': 3 }) }) });
- *
- * _.has(object, 'a');
- * // => true
- *
- * _.has(object, 'a.b.c');
- * // => true
- *
- * _.has(object, ['a', 'b', 'c']);
- * // => true
- *
- * _.has(other, 'a');
- * // => false
- */
- function has(object, path) {
- return hasPath(object, path, baseHas);
- }
-
- function memoize(fn, hasher) {
- var memo = Object.create(null);
- var queues = Object.create(null);
- hasher = hasher || identity;
- var memoized = rest(function memoized(args) {
- var callback = args.pop();
- var key = hasher.apply(null, args);
- if (has(memo, key)) {
- setImmediate$1(function () {
- callback.apply(null, memo[key]);
- });
- } else if (has(queues, key)) {
- queues[key].push(callback);
- } else {
- queues[key] = [callback];
- fn.apply(null, args.concat([rest(function (args) {
- memo[key] = args;
- var q = queues[key];
- delete queues[key];
- for (var i = 0, l = q.length; i < l; i++) {
- q[i].apply(null, args);
- }
- })]));
- }
- });
- memoized.memo = memo;
- memoized.unmemoized = fn;
- return memoized;
- }
-
- var nexTick = typeof process === 'object' && typeof process.nextTick === 'function' ? process.nextTick : setImmediate$1;
-
- function _parallel(eachfn, tasks, callback) {
- callback = callback || noop;
- var results = isArrayLike(tasks) ? [] : {};
-
- eachfn(tasks, function (task, key, callback) {
- task(rest(function (err, args) {
- if (args.length <= 1) {
- args = args[0];
- }
- results[key] = args;
- callback(err);
- }));
- }, function (err) {
- callback(err, results);
- });
- }
- function parallel(tasks, cb) {
- return _parallel(eachOf, tasks, cb);
- }
+ /**
+ * Gets the last element of `array`.
+ *
+ * @static
+ * @memberOf _
+ * @category Array
+ * @param {Array} array The array to query.
+ * @returns {*} Returns the last element of `array`.
+ * @example
+ *
+ * _.last([1, 2, 3]);
+ * // => 3
+ */
+ function last(array) {
+ var length = array ? array.length : 0;
+ return length ? array[length - 1] : undefined;
+ }
- function parallelLimit(tasks, limit, cb) {
- return _parallel(_eachOfLimit(limit), tasks, cb);
- }
+ /**
+ * The base implementation of `_.slice` without an iteratee call guard.
+ *
+ * @private
+ * @param {Array} array The array to slice.
+ * @param {number} [start=0] The start position.
+ * @param {number} [end=array.length] The end position.
+ * @returns {Array} Returns the slice of `array`.
+ */
+ function baseSlice(array, start, end) {
+ var index = -1,
+ length = array.length;
- function queue (worker, concurrency) {
- return queue$1(function (items, cb) {
- worker(items[0], cb);
- }, concurrency, 1);
- }
+ if (start < 0) {
+ start = -start > length ? 0 : (length + start);
+ }
+ end = end > length ? length : end;
+ if (end < 0) {
+ end += length;
+ }
+ length = start > end ? 0 : ((end - start) >>> 0);
+ start >>>= 0;
- function priorityQueue (worker, concurrency) {
- function _compareTasks(a, b) {
- return a.priority - b.priority;
+ var result = Array(length);
+ while (++index < length) {
+ result[index] = array[index + start];
}
+ return result;
+ }
- function _binarySearch(sequence, item, compare) {
- var beg = -1,
- end = sequence.length - 1;
- while (beg < end) {
- var mid = beg + (end - beg + 1 >>> 1);
- if (compare(item, sequence[mid]) >= 0) {
- beg = mid;
- } else {
- end = mid - 1;
- }
- }
- return beg;
+ /**
+ * The base implementation of `_.get` without support for default values.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to get.
+ * @returns {*} Returns the resolved value.
+ */
+ function baseGet(object, path) {
+ path = isKey(path, object) ? [path + ''] : baseCastPath(path);
+
+ var index = 0,
+ length = path.length;
+
+ while (object != null && index < length) {
+ object = object[path[index++]];
}
+ return (index && index == length) ? object : undefined;
+ }
- function _insert(q, data, priority, callback) {
- if (callback != null && typeof callback !== 'function') {
- throw new Error('task callback must be a function');
- }
- q.started = true;
- if (!isArray(data)) {
- data = [data];
- }
- if (data.length === 0) {
- // call drain immediately if there are no tasks
- return setImmediate$1(function () {
- q.drain();
- });
- }
- arrayEach(data, function (task) {
- var item = {
- data: task,
- priority: priority,
- callback: typeof callback === 'function' ? callback : noop
- };
-
- q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);
-
- if (q.tasks.length === q.concurrency) {
- q.saturated();
- }
- setImmediate$1(q.process);
- });
+ /**
+ * Gets the value at `path` of `object`. If the resolved value is
+ * `undefined` the `defaultValue` is used in its place.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path of the property to get.
+ * @param {*} [defaultValue] The value returned if the resolved value is `undefined`.
+ * @returns {*} Returns the resolved value.
+ * @example
+ *
+ * var object = { 'a': [{ 'b': { 'c': 3 } }] };
+ *
+ * _.get(object, 'a[0].b.c');
+ * // => 3
+ *
+ * _.get(object, ['a', '0', 'b', 'c']);
+ * // => 3
+ *
+ * _.get(object, 'a.b.c', 'default');
+ * // => 'default'
+ */
+ function get(object, path, defaultValue) {
+ var result = object == null ? undefined : baseGet(object, path);
+ return result === undefined ? defaultValue : result;
+ }
+
+ /**
+ * Gets the parent value at `path` of `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array} path The path to get the parent value of.
+ * @returns {*} Returns the parent value.
+ */
+ function parent(object, path) {
+ return path.length == 1 ? object : get(object, baseSlice(path, 0, -1));
+ }
+
+ /**
+ * Checks if `path` exists on `object`.
+ *
+ * @private
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @param {Function} hasFunc The function to check properties.
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
+ */
+ function hasPath(object, path, hasFunc) {
+ if (object == null) {
+ return false;
+ }
+ var result = hasFunc(object, path);
+ if (!result && !isKey(path)) {
+ path = baseCastPath(path);
+ object = parent(object, path);
+ if (object != null) {
+ path = last(path);
+ result = hasFunc(object, path);
+ }
}
+ var length = object ? object.length : undefined;
+ return result || (
+ !!length && isLength(length) && isIndex(path, length) &&
+ (isArray(object) || isString(object) || isArguments(object))
+ );
+ }
- // Start with a normal queue
- var q = queue(worker, concurrency);
+ /**
+ * Checks if `path` is a direct property of `object`.
+ *
+ * @static
+ * @memberOf _
+ * @category Object
+ * @param {Object} object The object to query.
+ * @param {Array|string} path The path to check.
+ * @returns {boolean} Returns `true` if `path` exists, else `false`.
+ * @example
+ *
+ * var object = { 'a': { 'b': { 'c': 3 } } };
+ * var other = _.create({ 'a': _.create({ 'b': _.create({ 'c': 3 }) }) });
+ *
+ * _.has(object, 'a');
+ * // => true
+ *
+ * _.has(object, 'a.b.c');
+ * // => true
+ *
+ * _.has(object, ['a', 'b', 'c']);
+ * // => true
+ *
+ * _.has(other, 'a');
+ * // => false
+ */
+ function has(object, path) {
+ return hasPath(object, path, baseHas);
+ }
- // Override push to accept second parameter representing priority
- q.push = function (data, priority, callback) {
- _insert(q, data, priority, callback);
- };
+ function memoize(fn, hasher) {
+ var memo = Object.create(null);
+ var queues = Object.create(null);
+ hasher = hasher || identity;
+ var memoized = rest(function memoized(args) {
+ var callback = args.pop();
+ var key = hasher.apply(null, args);
+ if (has(memo, key)) {
+ setImmediate$1(function () {
+ callback.apply(null, memo[key]);
+ });
+ } else if (has(queues, key)) {
+ queues[key].push(callback);
+ } else {
+ queues[key] = [callback];
+ fn.apply(null, args.concat([rest(function (args) {
+ memo[key] = args;
+ var q = queues[key];
+ delete queues[key];
+ for (var i = 0, l = q.length; i < l; i++) {
+ q[i].apply(null, args);
+ }
+ })]));
+ }
+ });
+ memoized.memo = memo;
+ memoized.unmemoized = fn;
+ return memoized;
+ }
- // Remove unshift function
- delete q.unshift;
+ function _parallel(eachfn, tasks, callback) {
+ callback = callback || noop;
+ var results = isArrayLike(tasks) ? [] : {};
+
+ eachfn(tasks, function (task, key, callback) {
+ task(rest(function (err, args) {
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ results[key] = args;
+ callback(err);
+ }));
+ }, function (err) {
+ callback(err, results);
+ });
+ }
- return q;
- }
+ function parallelLimit(tasks, limit, cb) {
+ return _parallel(_eachOfLimit(limit), tasks, cb);
+ }
- var slice = Array.prototype.slice;
+ var parallel = doLimit(parallelLimit, Infinity);
- function reduceRight(arr, memo, iterator, cb) {
- var reversed = slice.call(arr).reverse();
- reduce(reversed, memo, iterator, cb);
- }
+ function queue$1 (worker, concurrency) {
+ return queue(function (items, cb) {
+ worker(items[0], cb);
+ }, concurrency, 1);
+ }
- function reject$1(eachfn, arr, iterator, callback) {
- _filter(eachfn, arr, function (value, cb) {
- iterator(value, function (err, v) {
- if (err) {
- cb(err);
- } else {
- cb(null, !v);
- }
- });
- }, callback);
- }
+ function priorityQueue (worker, concurrency) {
+ function _compareTasks(a, b) {
+ return a.priority - b.priority;
+ }
- var reject = doParallel(reject$1);
+ function _binarySearch(sequence, item, compare) {
+ var beg = -1,
+ end = sequence.length - 1;
+ while (beg < end) {
+ var mid = beg + (end - beg + 1 >>> 1);
+ if (compare(item, sequence[mid]) >= 0) {
+ beg = mid;
+ } else {
+ end = mid - 1;
+ }
+ }
+ return beg;
+ }
- var rejectLimit = doParallelLimit(reject$1);
+ function _insert(q, data, priority, callback) {
+ if (callback != null && typeof callback !== 'function') {
+ throw new Error('task callback must be a function');
+ }
+ q.started = true;
+ if (!isArray(data)) {
+ data = [data];
+ }
+ if (data.length === 0) {
+ // call drain immediately if there are no tasks
+ return setImmediate$1(function () {
+ q.drain();
+ });
+ }
+ arrayEach(data, function (task) {
+ var item = {
+ data: task,
+ priority: priority,
+ callback: typeof callback === 'function' ? callback : noop
+ };
+
+ q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);
+
+ if (q.tasks.length === q.concurrency) {
+ q.saturated();
+ }
+ if (q.tasks.length <= q.concurrency - q.buffer) {
+ q.unsaturated();
+ }
+ setImmediate$1(q.process);
+ });
+ }
- var rejectSeries = doSeries(reject$1);
+ // Start with a normal queue
+ var q = queue$1(worker, concurrency);
- function series(tasks, cb) {
- return _parallel(eachOfSeries, tasks, cb);
- }
+ // Override push to accept second parameter representing priority
+ q.push = function (data, priority, callback) {
+ _insert(q, data, priority, callback);
+ };
- function retry(times, task, callback) {
- var DEFAULT_TIMES = 5;
- var DEFAULT_INTERVAL = 0;
+ // Remove unshift function
+ delete q.unshift;
- var attempts = [];
+ return q;
+ }
- var opts = {
- times: DEFAULT_TIMES,
- interval: DEFAULT_INTERVAL
- };
+ /**
+ * Creates a `baseEach` or `baseEachRight` function.
+ *
+ * @private
+ * @param {Function} eachFunc The function to iterate over a collection.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Function} Returns the new base function.
+ */
+ function createBaseEach(eachFunc, fromRight) {
+ return function(collection, iteratee) {
+ if (collection == null) {
+ return collection;
+ }
+ if (!isArrayLike(collection)) {
+ return eachFunc(collection, iteratee);
+ }
+ var length = collection.length,
+ index = fromRight ? length : -1,
+ iterable = Object(collection);
- function parseTimes(acc, t) {
- if (typeof t === 'number') {
- acc.times = parseInt(t, 10) || DEFAULT_TIMES;
- } else if (typeof t === 'object') {
- acc.times = parseInt(t.times, 10) || DEFAULT_TIMES;
- acc.interval = parseInt(t.interval, 10) || DEFAULT_INTERVAL;
- } else {
- throw new Error('Unsupported argument type for \'times\': ' + typeof t);
+ while ((fromRight ? index-- : ++index < length)) {
+ if (iteratee(iterable[index], index, iterable) === false) {
+ break;
}
- }
+ }
+ return collection;
+ };
+ }
- var length = arguments.length;
- if (length < 1 || length > 3) {
- throw new Error('Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)');
- } else if (length <= 2 && typeof times === 'function') {
- callback = task;
- task = times;
- }
- if (typeof times !== 'function') {
- parseTimes(opts, times);
- }
- opts.callback = callback;
- opts.task = task;
-
- function wrappedTask(wrappedCallback, wrappedResults) {
- function retryAttempt(task, finalAttempt) {
- return function (seriesCallback) {
- task(function (err, result) {
- seriesCallback(!err || finalAttempt, {
- err: err,
- result: result
- });
- }, wrappedResults);
- };
- }
+ /**
+ * The base implementation of `_.forEach` without support for iteratee shorthands.
+ *
+ * @private
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} iteratee The function invoked per iteration.
+ * @returns {Array|Object} Returns `collection`.
+ */
+ var baseEach = createBaseEach(baseForOwn);
+
+ /**
+ * Iterates over elements of `collection` invoking `iteratee` for each element.
+ * The iteratee is invoked with three arguments: (value, index|key, collection).
+ * Iteratee functions may exit iteration early by explicitly returning `false`.
+ *
+ * **Note:** As with other "Collections" methods, objects with a "length" property
+ * are iterated like arrays. To avoid this behavior use `_.forIn` or `_.forOwn`
+ * for object iteration.
+ *
+ * @static
+ * @memberOf _
+ * @alias each
+ * @category Collection
+ * @param {Array|Object} collection The collection to iterate over.
+ * @param {Function} [iteratee=_.identity] The function invoked per iteration.
+ * @returns {Array|Object} Returns `collection`.
+ * @example
+ *
+ * _([1, 2]).forEach(function(value) {
+ * console.log(value);
+ * });
+ * // => logs `1` then `2`
+ *
+ * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
+ * console.log(key);
+ * });
+ * // => logs 'a' then 'b' (iteration order is not guaranteed)
+ */
+ function forEach(collection, iteratee) {
+ return (typeof iteratee == 'function' && isArray(collection))
+ ? arrayEach(collection, iteratee)
+ : baseEach(collection, baseCastFunction(iteratee));
+ }
- function retryInterval(interval) {
- return function (seriesCallback) {
- setTimeout(function () {
- seriesCallback(null);
- }, interval);
- };
- }
+ function race(tasks, cb) {
+ cb = once(cb || noop);
+ if (!isArray(tasks)) return cb(new TypeError('First argument to race must be an array of functions'));
+ if (!tasks.length) return cb();
+ forEach(tasks, function (task) {
+ task(cb);
+ });
+ }
- while (opts.times) {
+ var slice = Array.prototype.slice;
- var finalAttempt = !(opts.times -= 1);
- attempts.push(retryAttempt(opts.task, finalAttempt));
- if (!finalAttempt && opts.interval > 0) {
- attempts.push(retryInterval(opts.interval));
- }
- }
+ function reduceRight(arr, memo, iterator, cb) {
+ var reversed = slice.call(arr).reverse();
+ reduce(reversed, memo, iterator, cb);
+ }
- series(attempts, function (done, data) {
- data = data[data.length - 1];
- (wrappedCallback || opts.callback)(data.err, data.result);
- });
- }
+ function reject$1(eachfn, arr, iterator, callback) {
+ _filter(eachfn, arr, function (value, cb) {
+ iterator(value, function (err, v) {
+ if (err) {
+ cb(err);
+ } else {
+ cb(null, !v);
+ }
+ });
+ }, callback);
+ }
- // If a callback is passed, run this as a controll flow
- return opts.callback ? wrappedTask() : wrappedTask;
- }
+ var rejectLimit = doParallelLimit(reject$1);
- var some = _createTester(eachOf, Boolean, identity);
+ var reject = doLimit(rejectLimit, Infinity);
- var someLimit = _createTester(eachOfLimit, Boolean, identity);
+ var rejectSeries = doLimit(rejectLimit, 1);
- function sortBy(arr, iterator, cb) {
- map(arr, function (x, cb) {
- iterator(x, function (err, criteria) {
- if (err) return cb(err);
- cb(null, { value: x, criteria: criteria });
- });
- }, function (err, results) {
- if (err) return cb(err);
- cb(null, arrayMap(results.sort(comparator), baseProperty('value')));
- });
+ function series(tasks, cb) {
+ return _parallel(eachOfSeries, tasks, cb);
+ }
- function comparator(left, right) {
- var a = left.criteria,
- b = right.criteria;
- return a < b ? -1 : a > b ? 1 : 0;
- }
- }
-
- /* Built-in method references for those with the same name as other `lodash` methods. */
- var nativeCeil = Math.ceil;
- var nativeMax$2 = Math.max;
- /**
- * The base implementation of `_.range` and `_.rangeRight` which doesn't
- * coerce arguments to numbers.
- *
- * @private
- * @param {number} start The start of the range.
- * @param {number} end The end of the range.
- * @param {number} step The value to increment or decrement by.
- * @param {boolean} [fromRight] Specify iterating from right to left.
- * @returns {Array} Returns the new array of numbers.
- */
- function baseRange(start, end, step, fromRight) {
- var index = -1,
- length = nativeMax$2(nativeCeil((end - start) / (step || 1)), 0),
- result = Array(length);
-
- while (length--) {
- result[fromRight ? length : ++index] = start;
- start += step;
- }
- return result;
- }
-
- function times (count, iterator, callback) {
- map(baseRange(0, count, 1), iterator, callback);
- }
-
- function timeLimit(count, limit, iterator, cb) {
- return mapLimit(baseRange(0, count, 1), limit, iterator, cb);
- }
-
- function timesSeries (count, iterator, callback) {
- mapSeries(baseRange(0, count, 1), iterator, callback);
- }
-
- function transform(arr, memo, iterator, callback) {
- if (arguments.length === 3) {
- callback = iterator;
- iterator = memo;
- memo = isArray(arr) ? [] : {};
- }
+ function retry(times, task, callback) {
+ var DEFAULT_TIMES = 5;
+ var DEFAULT_INTERVAL = 0;
+
+ var opts = {
+ times: DEFAULT_TIMES,
+ interval: DEFAULT_INTERVAL
+ };
+
+ function parseTimes(acc, t) {
+ if (typeof t === 'object') {
+ acc.times = +t.times || DEFAULT_TIMES;
+ acc.interval = +t.interval || DEFAULT_INTERVAL;
+ } else if (typeof t === 'number' || typeof t === 'string') {
+ acc.times = +t || DEFAULT_TIMES;
+ } else {
+ throw new Error("Invalid arguments for async.retry");
+ }
+ }
- eachOf(arr, function (v, k, cb) {
- iterator(memo, v, k, cb);
- }, function (err) {
- callback(err, memo);
- });
- }
+ if (arguments.length < 3 && typeof times === 'function') {
+ callback = task || noop;
+ task = times;
+ } else {
+ parseTimes(opts, times);
+ callback = callback || noop;
+ }
- function unmemoize(fn) {
- return function () {
- return (fn.unmemoized || fn).apply(null, arguments);
- };
- }
-
- function until(test, iterator, cb) {
- return whilst(function () {
- return !test.apply(this, arguments);
- }, iterator, cb);
- }
-
- function waterfall (tasks, cb) {
- cb = once(cb || noop);
- if (!isArray(tasks)) return cb(new Error('First argument to waterfall must be an array of functions'));
- if (!tasks.length) return cb();
-
- function wrapIterator(iterator) {
- return rest(function (err, args) {
- if (err) {
- cb.apply(null, [err].concat(args));
- } else {
- var next = iterator.next();
- if (next) {
- args.push(wrapIterator(next));
- } else {
- args.push(cb);
- }
- ensureAsync(iterator).apply(null, args);
- }
- });
+ if (typeof task !== 'function') {
+ throw new Error("Invalid arguments for async.retry");
+ }
+
+ var attempts = [];
+ while (opts.times) {
+ var isFinalAttempt = !(opts.times -= 1);
+ attempts.push(retryAttempt(isFinalAttempt));
+ if (!isFinalAttempt && opts.interval > 0) {
+ attempts.push(retryInterval(opts.interval));
+ }
+ }
+
+ series(attempts, function (done, data) {
+ data = data[data.length - 1];
+ callback(data.err, data.result);
+ });
+
+ function retryAttempt(isFinalAttempt) {
+ return function (seriesCallback) {
+ task(function (err, result) {
+ seriesCallback(!err || isFinalAttempt, {
+ err: err,
+ result: result
+ });
+ });
+ };
+ }
+
+ function retryInterval(interval) {
+ return function (seriesCallback) {
+ setTimeout(function () {
+ seriesCallback(null);
+ }, interval);
+ };
+ }
+ }
+
+ var someLimit = _createTester(eachOfLimit, Boolean, identity);
+
+ var some = doLimit(someLimit, Infinity);
+
+ var someSeries = doLimit(someLimit, 1);
+
+ function sortBy(arr, iterator, cb) {
+ map(arr, function (x, cb) {
+ iterator(x, function (err, criteria) {
+ if (err) return cb(err);
+ cb(null, { value: x, criteria: criteria });
+ });
+ }, function (err, results) {
+ if (err) return cb(err);
+ cb(null, arrayMap(results.sort(comparator), baseProperty('value')));
+ });
+
+ function comparator(left, right) {
+ var a = left.criteria,
+ b = right.criteria;
+ return a < b ? -1 : a > b ? 1 : 0;
+ }
+ }
+
+ function timeout(asyncFn, miliseconds) {
+ var originalCallback, timer;
+ var timedOut = false;
+
+ function injectedCallback() {
+ if (!timedOut) {
+ originalCallback.apply(null, arguments);
+ clearTimeout(timer);
+ }
+ }
+
+ function timeoutCallback() {
+ var error = new Error('Callback function timed out.');
+ error.code = 'ETIMEDOUT';
+ timedOut = true;
+ originalCallback(error);
+ }
+
+ function injectCallback(asyncFnArgs) {
+ // replace callback in asyncFn args
+ var args = Array.prototype.slice.call(asyncFnArgs, 0);
+ originalCallback = args[args.length - 1];
+ args[args.length - 1] = injectedCallback;
+ return args;
+ }
+
+ function wrappedFn() {
+ // setup timer and call original function
+ timer = setTimeout(timeoutCallback, miliseconds);
+ asyncFn.apply(null, injectCallback(arguments));
+ }
+
+ return wrappedFn;
+ }
+
+ /* Built-in method references for those with the same name as other `lodash` methods. */
+ var nativeCeil = Math.ceil;
+ var nativeMax$2 = Math.max;
+ /**
+ * The base implementation of `_.range` and `_.rangeRight` which doesn't
+ * coerce arguments to numbers.
+ *
+ * @private
+ * @param {number} start The start of the range.
+ * @param {number} end The end of the range.
+ * @param {number} step The value to increment or decrement by.
+ * @param {boolean} [fromRight] Specify iterating from right to left.
+ * @returns {Array} Returns the new array of numbers.
+ */
+ function baseRange(start, end, step, fromRight) {
+ var index = -1,
+ length = nativeMax$2(nativeCeil((end - start) / (step || 1)), 0),
+ result = Array(length);
+
+ while (length--) {
+ result[fromRight ? length : ++index] = start;
+ start += step;
}
- wrapIterator(iterator(tasks))();
- }
-
- var index = {
- applyEach: applyEach,
- applyEachSeries: applyEachSeries,
- apply: apply,
- asyncify: asyncify,
- auto: auto,
- cargo: cargo,
- compose: compose,
- concat: concat,
- concatSeries: concatSeries,
- constant: constant,
- detect: detect,
- detectLimit: detectLimit,
- detectSeries: detectSeries,
- dir: dir,
- doDuring: doDuring,
- doUntil: doUntil,
- doWhilst: doWhilst,
- during: during,
- each: each,
- eachLimit: eachLimit,
- eachOf: eachOf,
- eachOfLimit: eachOfLimit,
- eachOfSeries: eachOfSeries,
- eachSeries: eachSeries,
- ensureAsync: ensureAsync,
- every: every,
- everyLimit: everyLimit,
- filter: filter,
- filterLimit: filterLimit,
- filterSeries: filterSeries,
- forever: forever,
- iterator: iterator,
- log: log,
- map: map,
- mapLimit: mapLimit,
- mapSeries: mapSeries,
- memoize: memoize,
- nextTick: nexTick,
- parallel: parallel,
- parallelLimit: parallelLimit,
- priorityQueue: priorityQueue,
- queue: queue,
- reduce: reduce,
- reduceRight: reduceRight,
- reject: reject,
- rejectLimit: rejectLimit,
- rejectSeries: rejectSeries,
- retry: retry,
- seq: seq,
- series: series,
- setImmediate: setImmediate$1,
- some: some,
- someLimit: someLimit,
- sortBy: sortBy,
- times: times,
- timesLimit: timeLimit,
- timesSeries: timesSeries,
- transform: transform,
- unmemoize: unmemoize,
- until: until,
- waterfall: waterfall,
- whilst: whilst,
-
- // aliases
- all: every,
- any: some,
- forEach: each,
- forEachSeries: eachSeries,
- forEachLimit: eachLimit,
- forEachOf: eachOf,
- forEachOfSeries: eachOfSeries,
- forEachOfLimit: eachOfLimit,
- inject: reduce,
- foldl: reduce,
- foldr: reduceRight,
- select: filter,
- selectLimit: filterLimit,
- selectSeries: filterSeries,
- wrapSync: asyncify
- };
-
- exports['default'] = index;
- exports.applyEach = applyEach;
- exports.applyEachSeries = applyEachSeries;
- exports.apply = apply;
- exports.asyncify = asyncify;
- exports.auto = auto;
- exports.cargo = cargo;
- exports.compose = compose;
- exports.concat = concat;
- exports.concatSeries = concatSeries;
- exports.constant = constant;
- exports.detect = detect;
- exports.detectLimit = detectLimit;
- exports.detectSeries = detectSeries;
- exports.dir = dir;
- exports.doDuring = doDuring;
- exports.doUntil = doUntil;
- exports.doWhilst = doWhilst;
- exports.during = during;
- exports.each = each;
- exports.eachLimit = eachLimit;
- exports.eachOf = eachOf;
- exports.eachOfLimit = eachOfLimit;
- exports.eachOfSeries = eachOfSeries;
- exports.eachSeries = eachSeries;
- exports.ensureAsync = ensureAsync;
- exports.every = every;
- exports.everyLimit = everyLimit;
- exports.filter = filter;
- exports.filterLimit = filterLimit;
- exports.filterSeries = filterSeries;
- exports.forever = forever;
- exports.iterator = iterator;
- exports.log = log;
- exports.map = map;
- exports.mapLimit = mapLimit;
- exports.mapSeries = mapSeries;
- exports.memoize = memoize;
- exports.nextTick = nexTick;
- exports.parallel = parallel;
- exports.parallelLimit = parallelLimit;
- exports.priorityQueue = priorityQueue;
- exports.queue = queue;
- exports.reduce = reduce;
- exports.reduceRight = reduceRight;
- exports.reject = reject;
- exports.rejectLimit = rejectLimit;
- exports.rejectSeries = rejectSeries;
- exports.retry = retry;
- exports.seq = seq;
- exports.series = series;
- exports.setImmediate = setImmediate$1;
- exports.some = some;
- exports.someLimit = someLimit;
- exports.sortBy = sortBy;
- exports.times = times;
- exports.timesLimit = timeLimit;
- exports.timesSeries = timesSeries;
- exports.transform = transform;
- exports.unmemoize = unmemoize;
- exports.until = until;
- exports.waterfall = waterfall;
- exports.whilst = whilst;
- exports.all = every;
- exports.any = some;
- exports.forEach = each;
- exports.forEachSeries = eachSeries;
- exports.forEachLimit = eachLimit;
- exports.forEachOf = eachOf;
- exports.forEachOfSeries = eachOfSeries;
- exports.forEachOfLimit = eachOfLimit;
- exports.inject = reduce;
- exports.foldl = reduce;
- exports.foldr = reduceRight;
- exports.select = filter;
- exports.selectLimit = filterLimit;
- exports.selectSeries = filterSeries;
- exports.wrapSync = asyncify;
+ return result;
+ }
+
+ function timeLimit(count, limit, iterator, cb) {
+ return mapLimit(baseRange(0, count, 1), limit, iterator, cb);
+ }
+
+ var times = doLimit(timeLimit, Infinity);
+
+ var timesSeries = doLimit(timeLimit, 1);
+
+ function transform(arr, memo, iterator, callback) {
+ if (arguments.length === 3) {
+ callback = iterator;
+ iterator = memo;
+ memo = isArray(arr) ? [] : {};
+ }
+
+ eachOf(arr, function (v, k, cb) {
+ iterator(memo, v, k, cb);
+ }, function (err) {
+ callback(err, memo);
+ });
+ }
+
+ function unmemoize(fn) {
+ return function () {
+ return (fn.unmemoized || fn).apply(null, arguments);
+ };
+ }
+
+ function until(test, iterator, cb) {
+ return whilst(function () {
+ return !test.apply(this, arguments);
+ }, iterator, cb);
+ }
+
+ function waterfall (tasks, cb) {
+ cb = once(cb || noop);
+ if (!isArray(tasks)) return cb(new Error('First argument to waterfall must be an array of functions'));
+ if (!tasks.length) return cb();
+ var taskIndex = 0;
+
+ function nextTask(args) {
+ if (taskIndex === tasks.length) {
+ return cb.apply(null, [null].concat(args));
+ }
+
+ var taskCallback = onlyOnce(rest(function (err, args) {
+ if (err) {
+ return cb.apply(null, [err].concat(args));
+ }
+ nextTask(args);
+ }));
+
+ args.push(taskCallback);
+
+ var task = tasks[taskIndex++];
+ task.apply(null, args);
+ }
+
+ nextTask([]);
+ }
+
+ var index = {
+ applyEach: applyEach,
+ applyEachSeries: applyEachSeries,
+ apply: apply$1,
+ asyncify: asyncify,
+ auto: auto,
+ autoInject: autoInject,
+ cargo: cargo,
+ compose: compose,
+ concat: concat,
+ concatSeries: concatSeries,
+ constant: constant$1,
+ detect: detect,
+ detectLimit: detectLimit,
+ detectSeries: detectSeries,
+ dir: dir,
+ doDuring: doDuring,
+ doUntil: doUntil,
+ doWhilst: doWhilst,
+ during: during,
+ each: each,
+ eachLimit: eachLimit,
+ eachOf: eachOf,
+ eachOfLimit: eachOfLimit,
+ eachOfSeries: eachOfSeries,
+ eachSeries: eachSeries,
+ ensureAsync: ensureAsync,
+ every: every,
+ everyLimit: everyLimit,
+ everySeries: everySeries,
+ filter: filter,
+ filterLimit: filterLimit,
+ filterSeries: filterSeries,
+ forever: forever,
+ iterator: iterator,
+ log: log,
+ map: map,
+ mapLimit: mapLimit,
+ mapSeries: mapSeries,
+ memoize: memoize,
+ nextTick: setImmediate$1,
+ parallel: parallel,
+ parallelLimit: parallelLimit,
+ priorityQueue: priorityQueue,
+ queue: queue$1,
+ race: race,
+ reduce: reduce,
+ reduceRight: reduceRight,
+ reject: reject,
+ rejectLimit: rejectLimit,
+ rejectSeries: rejectSeries,
+ retry: retry,
+ seq: seq,
+ series: series,
+ setImmediate: setImmediate$1,
+ some: some,
+ someLimit: someLimit,
+ someSeries: someSeries,
+ sortBy: sortBy,
+ timeout: timeout,
+ times: times,
+ timesLimit: timeLimit,
+ timesSeries: timesSeries,
+ transform: transform,
+ unmemoize: unmemoize,
+ until: until,
+ waterfall: waterfall,
+ whilst: whilst,
+
+ // aliases
+ all: every,
+ any: some,
+ forEach: each,
+ forEachSeries: eachSeries,
+ forEachLimit: eachLimit,
+ forEachOf: eachOf,
+ forEachOfSeries: eachOfSeries,
+ forEachOfLimit: eachOfLimit,
+ inject: reduce,
+ foldl: reduce,
+ foldr: reduceRight,
+ select: filter,
+ selectLimit: filterLimit,
+ selectSeries: filterSeries,
+ wrapSync: asyncify
+ };
+
+ exports['default'] = index;
+ exports.applyEach = applyEach;
+ exports.applyEachSeries = applyEachSeries;
+ exports.apply = apply$1;
+ exports.asyncify = asyncify;
+ exports.auto = auto;
+ exports.autoInject = autoInject;
+ exports.cargo = cargo;
+ exports.compose = compose;
+ exports.concat = concat;
+ exports.concatSeries = concatSeries;
+ exports.constant = constant$1;
+ exports.detect = detect;
+ exports.detectLimit = detectLimit;
+ exports.detectSeries = detectSeries;
+ exports.dir = dir;
+ exports.doDuring = doDuring;
+ exports.doUntil = doUntil;
+ exports.doWhilst = doWhilst;
+ exports.during = during;
+ exports.each = each;
+ exports.eachLimit = eachLimit;
+ exports.eachOf = eachOf;
+ exports.eachOfLimit = eachOfLimit;
+ exports.eachOfSeries = eachOfSeries;
+ exports.eachSeries = eachSeries;
+ exports.ensureAsync = ensureAsync;
+ exports.every = every;
+ exports.everyLimit = everyLimit;
+ exports.everySeries = everySeries;
+ exports.filter = filter;
+ exports.filterLimit = filterLimit;
+ exports.filterSeries = filterSeries;
+ exports.forever = forever;
+ exports.iterator = iterator;
+ exports.log = log;
+ exports.map = map;
+ exports.mapLimit = mapLimit;
+ exports.mapSeries = mapSeries;
+ exports.memoize = memoize;
+ exports.nextTick = setImmediate$1;
+ exports.parallel = parallel;
+ exports.parallelLimit = parallelLimit;
+ exports.priorityQueue = priorityQueue;
+ exports.queue = queue$1;
+ exports.race = race;
+ exports.reduce = reduce;
+ exports.reduceRight = reduceRight;
+ exports.reject = reject;
+ exports.rejectLimit = rejectLimit;
+ exports.rejectSeries = rejectSeries;
+ exports.retry = retry;
+ exports.seq = seq;
+ exports.series = series;
+ exports.setImmediate = setImmediate$1;
+ exports.some = some;
+ exports.someLimit = someLimit;
+ exports.someSeries = someSeries;
+ exports.sortBy = sortBy;
+ exports.timeout = timeout;
+ exports.times = times;
+ exports.timesLimit = timeLimit;
+ exports.timesSeries = timesSeries;
+ exports.transform = transform;
+ exports.unmemoize = unmemoize;
+ exports.until = until;
+ exports.waterfall = waterfall;
+ exports.whilst = whilst;
+ exports.all = every;
+ exports.allLimit = everyLimit;
+ exports.allSeries = everySeries;
+ exports.any = some;
+ exports.anyLimit = someLimit;
+ exports.anySeries = someSeries;
+ exports.find = detect;
+ exports.findLimit = detectLimit;
+ exports.findSeries = detectSeries;
+ exports.forEach = each;
+ exports.forEachSeries = eachSeries;
+ exports.forEachLimit = eachLimit;
+ exports.forEachOf = eachOf;
+ exports.forEachOfSeries = eachOfSeries;
+ exports.forEachOfLimit = eachOfLimit;
+ exports.inject = reduce;
+ exports.foldl = reduce;
+ exports.foldr = reduceRight;
+ exports.select = filter;
+ exports.selectLimit = filterLimit;
+ exports.selectSeries = filterSeries;
+ exports.wrapSync = asyncify;
})); \ No newline at end of file
diff --git a/dist/async.min.js b/dist/async.min.js
index 2915a67..49eb539 100644
--- a/dist/async.min.js
+++ b/dist/async.min.js
@@ -1,2 +1,2 @@
-!function(n,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(n.async={})}(this,function(n){"use strict";function t(n,t,r){var e=r.length;switch(e){case 0:return n.call(t);case 1:return n.call(t,r[0]);case 2:return n.call(t,r[0],r[1]);case 3:return n.call(t,r[0],r[1],r[2])}return n.apply(t,r)}function r(n){var t=typeof n;return!!n&&("object"==t||"function"==t)}function e(n){var t=r(n)?nt.call(n):"";return t==Yn||t==Zn}function u(n){if(r(n)){var t=e(n.valueOf)?n.valueOf():n;n=r(t)?t+"":t}if("string"!=typeof n)return 0===n?n:+n;n=n.replace(rt,"");var u=ut.test(n);return u||it.test(n)?ot(n.slice(2),u?2:8):et.test(n)?tt:+n}function i(n){if(!n)return 0===n?n:0;if(n=u(n),n===ct||n===-ct){var t=0>n?-1:1;return t*ft}var r=n%1;return n===n?r?n-r:n:0}function o(n,r){if("function"!=typeof n)throw new TypeError(at);return r=lt(void 0===r?n.length-1:i(r),0),function(){for(var e=arguments,u=-1,i=lt(e.length-r,0),o=Array(i);++u<i;)o[u]=e[r+u];switch(r){case 0:return n.call(this,o);case 1:return n.call(this,e[0],o);case 2:return n.call(this,e[0],e[1],o)}var c=Array(r+1);for(u=-1;++u<r;)c[u]=e[u];return c[r]=o,t(n,this,c)}}function c(n){return o(function(t,r){var e=o(function(r){var e=this,u=r.pop();return n(t,function(n,t,u){n.apply(e,r.concat([u]))},u)});return r.length?e.apply(this,r):e})}function f(n,t){var r;if("function"!=typeof t)throw new TypeError(st);return n=i(n),function(){return--n>0&&(r=t.apply(this,arguments)),1>=n&&(t=void 0),r}}function a(n){return f(2,n)}function l(){}function s(n){return function(t){return null==t?void 0:t[n]}}function p(n){return"number"==typeof n&&n>-1&&n%1==0&&yt>=n}function y(n){return null!=n&&!("function"==typeof n&&e(n))&&p(pt(n))}function h(n,t){return vt.call(n,t)||"object"==typeof n&&t in n&&null===mt(n)}function v(n){return dt(Object(n))}function m(n,t){for(var r=-1,e=Array(n);++r<n;)e[r]=t(r);return e}function d(n){return!!n&&"object"==typeof n}function g(n){return d(n)&&y(n)}function b(n){return g(n)&&kt.call(n,"callee")&&(!jt.call(n,"callee")||wt.call(n)==gt)}function k(n){return"string"==typeof n||!St(n)&&d(n)&&Lt.call(n)==Ot}function w(n){var t=n?n.length:void 0;return p(t)&&(St(n)||k(n)||b(n))?m(t,String):null}function j(n,t){return n="number"==typeof n||At.test(n)?+n:-1,t=null==t?xt:t,n>-1&&n%1==0&&t>n}function S(n){var t=n&&n.constructor,r="function"==typeof t&&t.prototype||Tt;return n===r}function O(n){var t=S(n);if(!t&&!y(n))return v(n);var r=w(n),e=!!r,u=r||[],i=u.length;for(var o in n)!h(n,o)||e&&("length"==o||j(o,i))||t&&"constructor"==o||u.push(o);return u}function E(n){var t,r=-1;if(y(n))return t=n.length,function(){return r++,t>r?r:null};var e=O(n);return t=e.length,function(){return r++,t>r?e[r]:null}}function L(n){return function(){if(null===n)throw new Error("Callback was already called.");n.apply(this,arguments),n=null}}function x(n,t,r){function e(n){o--,n?r(n):null===u&&0>=o&&r(null)}r=a(r||l),n=n||[];for(var u,i=E(n),o=0;null!=(u=i());)o+=1,t(n[u],u,L(e));0===o&&r(null)}function A(n,t,r){function e(){var o=!0;return null===i?r(null):(t(n[i],i,L(function(n){if(n)r(n);else{if(i=u(),null===i)return r(null);o?$t(e):e()}})),void(o=!1))}r=a(r||l),n=n||[];var u=E(n),i=u();e()}function T(n){return o(function(t){var e,u=t.pop();try{e=n.apply(this,t)}catch(i){return u(i)}r(e)&&"function"==typeof e.then?e.then(function(n){u(null,n)})["catch"](function(n){u(n.message?n:new Error(n))}):u(null,e)})}function I(n,t){for(var r=-1,e=n.length;++r<e&&t(n[r],r,n)!==!1;);return n}function z(n,t){for(var r=-1,e=n.length;++r<e;)if(!t(n[r],r,n))return!1;return!0}function $(n){return function(t,r,e){for(var u=-1,i=Object(t),o=e(t),c=o.length;c--;){var f=o[n?c:++u];if(r(i[f],f,i)===!1)break}return t}}function M(n,t){return n&&Bt(n,t,O)}function q(n){return n}function B(n){return"function"==typeof n?n:q}function F(n,t){return n&&M(n,B(t))}function P(n,t,r){for(var e=n.length,u=t+(r?0:-1);r?u--:++u<e;){var i=n[u];if(i!==i)return u}return-1}function U(n,t,r){if(t!==t)return P(n,r);for(var e=r-1,u=n.length;++e<u;)if(n[e]===t)return e;return-1}function C(n,t,r){var e=n?n.length:0;return e?(r=i(r),0>r&&(r=Ft(e+r,0)),U(n,t,r)):-1}function D(n,t,r){function e(n){v.unshift(n)}function u(n){var t=C(v,n);t>=0&&v.splice(t,1)}function i(){f--,I(v.slice(),function(n){n()})}"function"==typeof arguments[1]&&(r=t,t=null),r=a(r||l);var c=O(n),f=c.length;if(!f)return r(null);t||(t=f);var s={},p=0,y=!1,v=[];e(function(){f||r(null,s)}),I(c,function(c){function f(){return t>p&&!h(s,c)&&z(d,function(n){return h(s,n)})}function a(){f()&&(p++,u(a),v[v.length-1](m,s))}if(!y){for(var l,v=St(n[c])?n[c]:[n[c]],m=o(function(n,t){if(p--,t.length<=1&&(t=t[0]),n){var e={};F(s,function(n,t){e[t]=n}),e[c]=t,y=!0,r(n,e)}else s[c]=t,$t(i)}),d=v.slice(0,v.length-1),g=d.length;g--;){if(!(l=n[d[g]]))throw new Error("Has non-existent dependency in "+d.join(", "));if(St(l)&&C(l,c)>=0)throw new Error("Has cyclic dependencies")}f()?(p++,v[v.length-1](m,s)):e(a)}})}function H(n,t){for(var r=-1,e=n.length,u=Array(e);++r<e;)u[r]=t(n[r],r,n);return u}function N(n,t,r){function e(n,t,r,e){if(null!=e&&"function"!=typeof e)throw new Error("task callback must be a function");return n.started=!0,St(t)||(t=[t]),0===t.length&&n.idle()?$t(function(){n.drain()}):(I(t,function(t){var u={data:t,callback:e||l};r?n.tasks.unshift(u):n.tasks.push(u),n.tasks.length===n.concurrency&&n.saturated()}),void $t(n.process))}function u(n,t){return function(){i-=1;var r=!1,e=arguments;I(t,function(n){I(o,function(t,e){t!==n||r||(o.splice(e,1),r=!0)}),n.callback.apply(n,e)}),n.tasks.length+i===0&&n.drain(),n.process()}}if(null==t)t=1;else if(0===t)throw new Error("Concurrency must not be zero");var i=0,o=[],c={tasks:[],concurrency:t,payload:r,saturated:l,empty:l,drain:l,started:!1,paused:!1,push:function(n,t){e(c,n,!1,t)},kill:function(){c.drain=l,c.tasks=[]},unshift:function(n,t){e(c,n,!0,t)},process:function(){for(;!c.paused&&i<c.concurrency&&c.tasks.length;){var t=c.payload?c.tasks.splice(0,c.payload):c.tasks.splice(0,c.tasks.length),r=H(t,s("data"));0===c.tasks.length&&c.empty(),i+=1,o.push(t[0]);var e=L(u(c,t));n(r,e)}},length:function(){return c.tasks.length},running:function(){return i},workersList:function(){return o},idle:function(){return c.tasks.length+i===0},pause:function(){c.paused=!0},resume:function(){if(c.paused!==!1){c.paused=!1;for(var n=Math.min(c.concurrency,c.tasks.length),t=1;n>=t;t++)$t(c.process)}}};return c}function Q(n,t){return N(n,1,t)}function R(n,t,r,e){A(n,function(n,e,u){r(t,n,function(n,r){t=r,u(n)})},function(n){e(n,t)})}function W(){var n=arguments;return o(function(t){var r=this,e=t[t.length-1];"function"==typeof e?t.pop():e=l,R(n,t,function(n,t,e){t.apply(r,n.concat([o(function(n,t){e(n,t)})]))},function(n,t){e.apply(r,[n].concat(t))})})}function G(){return W.apply(null,Pt.call(arguments))}function J(n,t,r,e){var u=[];n(t,function(n,t,e){r(n,function(n,t){u=u.concat(t||[]),e(n)})},function(n){e(n,u)})}function K(n){return function(t,r,e){return n(x,t,r,e)}}function V(n){return function(t,r,e){return n(A,t,r,e)}}function X(n,t,r){return function(e,u,i,o){function c(n){o&&(n?o(n):o(null,r(!1,void 0)))}function f(n,e,u){return o?void i(n,function(e,c){o&&(e?(o(e),o=i=!1):t(c)&&(o(null,r(!0,n)),o=i=!1)),u()}):u()}arguments.length>3?n(e,u,f,c):(o=i,i=u,n(e,f,c))}}function Y(n,t){return t}function Z(n){return function(t,r,e){e=a(e||l),t=t||[];var u=E(t);if(0>=n)return e(null);var i=!1,o=0,c=!1;!function f(){if(i&&0>=o)return e(null);for(;n>o&&!c;){var a=u();if(null===a)return i=!0,void(0>=o&&e(null));o+=1,r(t[a],a,L(function(n){o-=1,n?(e(n),c=!0):f()}))}}()}}function _(n,t,r,e){Z(t)(n,r,e)}function nn(n){return o(function(t,r){t.apply(null,r.concat([o(function(t,r){"object"==typeof console&&(t?console.error&&console.error(t):console[n]&&I(r,function(t){console[n](t)}))})]))})}function tn(n,t,r){r=r||l;var e=o(function(t,e){t?r(t):(e.push(u),n.apply(this,e))}),u=function(n,u){return n?r(n):u?void t(e):r(null)};n(u)}function rn(n,t,r){var e=0;tn(function(n){return e++<1?n(null,!0):void t.apply(this,arguments)},n,r)}function en(n,t,r){if(r=r||l,!n())return r(null);var e=o(function(u,i){return u?r(u):n.apply(this,i)?t(e):void r.apply(null,[null].concat(i))});t(e)}function un(n,t,r){var e=0;return en(function(){return++e<=1||t.apply(this,arguments)},n,r)}function on(n,t,r){return un(n,function(){return!t.apply(this,arguments)},r)}function cn(n){return function(t,r,e){return n(t,e)}}function fn(n,t,r){return x(n,cn(t),r)}function an(n,t,r,e){return Z(t)(n,cn(r),e)}function ln(n,t,r){return A(n,cn(t),r)}function sn(n){return o(function(t){var r=t.pop(),e=!0;t.push(function(){var n=arguments;e?$t(function(){r.apply(null,n)}):r.apply(null,n)}),n.apply(this,t),e=!1})}function pn(n){return!n}function yn(n,t,r,e){var u=[];n(t,function(n,t,e){r(n,function(r,i){r?e(r):(i&&u.push({index:t,value:n}),e())})},function(n){n?e(n):e(null,H(u.sort(function(n,t){return n.index-t.index}),s("value")))})}function hn(n){return function(t,r,e,u){return n(Z(r),t,e,u)}}function vn(n,t){function r(n){return n?e(n):void u(r)}var e=L(t||l),u=sn(n);r()}function mn(n){function t(r){function e(){return n.length&&n[r].apply(null,arguments),e.next()}return e.next=function(){return r<n.length-1?t(r+1):null},e}return t(0)}function dn(n,t,r,e){e=a(e||l),t=t||[];var u=y(t)?[]:{};n(t,function(n,t,e){r(n,function(n,r){u[t]=r,e(n)})},function(n){e(n,u)})}function gn(n){return n&&n.Object===Object?n:null}function bn(n){return"symbol"==typeof n||d(n)&&sr.call(n)==ar}function kn(n){if("string"==typeof n)return n;if(null==n)return"";if(bn(n))return fr?hr.call(n):"";var t=n+"";return"0"==t&&1/n==-pr?"-0":t}function wn(n){var t=[];return kn(n).replace(vr,function(n,r,e,u){t.push(e?u.replace(mr,"$1"):r||n)}),t}function jn(n){return St(n)?n:wn(n)}function Sn(n,t){return"number"==typeof n?!0:!St(n)&&(gr.test(n)||!dr.test(n)||null!=t&&n in Object(t))}function On(n){var t=n?n.length:0;return t?n[t-1]:void 0}function En(n,t,r){var e=-1,u=n.length;0>t&&(t=-t>u?0:u+t),r=r>u?u:r,0>r&&(r+=u),u=t>r?0:r-t>>>0,t>>>=0;for(var i=Array(u);++e<u;)i[e]=n[e+t];return i}function Ln(n,t){t=Sn(t,n)?[t+""]:jn(t);for(var r=0,e=t.length;null!=n&&e>r;)n=n[t[r++]];return r&&r==e?n:void 0}function xn(n,t,r){var e=null==n?void 0:Ln(n,t);return void 0===e?r:e}function An(n,t){return 1==t.length?n:xn(n,En(t,0,-1))}function Tn(n,t,r){if(null==n)return!1;var e=r(n,t);e||Sn(t)||(t=jn(t),n=An(n,t),null!=n&&(t=On(t),e=r(n,t)));var u=n?n.length:void 0;return e||!!u&&p(u)&&j(t,u)&&(St(n)||k(n)||b(n))}function In(n,t){return Tn(n,t,h)}function zn(n,t){var r=Object.create(null),e=Object.create(null);t=t||q;var u=o(function(u){var i=u.pop(),c=t.apply(null,u);In(r,c)?$t(function(){i.apply(null,r[c])}):In(e,c)?e[c].push(i):(e[c]=[i],n.apply(null,u.concat([o(function(n){r[c]=n;var t=e[c];delete e[c];for(var u=0,i=t.length;i>u;u++)t[u].apply(null,n)})])))});return u.memo=r,u.unmemoized=n,u}function $n(n,t,r){r=r||l;var e=y(t)?[]:{};n(t,function(n,t,r){n(o(function(n,u){u.length<=1&&(u=u[0]),e[t]=u,r(n)}))},function(n){r(n,e)})}function Mn(n,t){return $n(x,n,t)}function qn(n,t,r){return $n(Z(t),n,r)}function Bn(n,t){return N(function(t,r){n(t[0],r)},t,1)}function Fn(n,t){function r(n,t){return n.priority-t.priority}function e(n,t,r){for(var e=-1,u=n.length-1;u>e;){var i=e+(u-e+1>>>1);r(t,n[i])>=0?e=i:u=i-1}return e}function u(n,t,u,i){if(null!=i&&"function"!=typeof i)throw new Error("task callback must be a function");return n.started=!0,St(t)||(t=[t]),0===t.length?$t(function(){n.drain()}):void I(t,function(t){var o={data:t,priority:u,callback:"function"==typeof i?i:l};n.tasks.splice(e(n.tasks,o,r)+1,0,o),n.tasks.length===n.concurrency&&n.saturated(),$t(n.process)})}var i=Bn(n,t);return i.push=function(n,t,r){u(i,n,t,r)},delete i.unshift,i}function Pn(n,t,r,e){var u=kr.call(n).reverse();R(u,t,r,e)}function Un(n,t,r,e){yn(n,t,function(n,t){r(n,function(n,r){n?t(n):t(null,!r)})},e)}function Cn(n,t){return $n(A,n,t)}function Dn(n,t,r){function e(n,t){if("number"==typeof t)n.times=parseInt(t,10)||i;else{if("object"!=typeof t)throw new Error("Unsupported argument type for 'times': "+typeof t);n.times=parseInt(t.times,10)||i,n.interval=parseInt(t.interval,10)||o}}function u(n,t){function r(n,r){return function(e){n(function(n,t){e(!n||r,{err:n,result:t})},t)}}function e(n){return function(t){setTimeout(function(){t(null)},n)}}for(;f.times;){var u=!(f.times-=1);c.push(r(f.task,u)),!u&&f.interval>0&&c.push(e(f.interval))}Cn(c,function(t,r){r=r[r.length-1],(n||f.callback)(r.err,r.result)})}var i=5,o=0,c=[],f={times:i,interval:o},a=arguments.length;if(1>a||a>3)throw new Error("Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)");return 2>=a&&"function"==typeof n&&(r=t,t=n),"function"!=typeof n&&e(f,n),f.callback=r,f.task=t,f.callback?u():u}function Hn(n,t,r){function e(n,t){var r=n.criteria,e=t.criteria;return e>r?-1:r>e?1:0}Yt(n,function(n,r){t(n,function(t,e){return t?r(t):void r(null,{value:n,criteria:e})})},function(n,t){return n?r(n):void r(null,H(t.sort(e),s("value")))})}function Nn(n,t,r,e){for(var u=-1,i=xr(Lr((t-n)/(r||1)),0),o=Array(i);i--;)o[e?i:++u]=n,n+=r;return o}function Qn(n,t,r){Yt(Nn(0,n,1),t,r)}function Rn(n,t,r,e){return Zt(Nn(0,n,1),t,r,e)}function Wn(n,t,r){_t(Nn(0,n,1),t,r)}function Gn(n,t,r,e){3===arguments.length&&(e=r,r=t,t=St(n)?[]:{}),x(n,function(n,e,u){r(t,n,e,u)},function(n){e(n,t)})}function Jn(n){return function(){return(n.unmemoized||n).apply(null,arguments)}}function Kn(n,t,r){return en(function(){return!n.apply(this,arguments)},t,r)}function Vn(n,t){function r(n){return o(function(e,u){if(e)t.apply(null,[e].concat(u));else{var i=n.next();i?u.push(r(i)):u.push(t),sn(n).apply(null,u)}})}return t=a(t||l),St(n)?n.length?void r(mn(n))():t():t(new Error("First argument to waterfall must be an array of functions"))}var Xn,Yn="[object Function]",Zn="[object GeneratorFunction]",_n=Object.prototype,nt=_n.toString,tt=NaN,rt=/^\s+|\s+$/g,et=/^[-+]0x[0-9a-f]+$/i,ut=/^0b[01]+$/i,it=/^0o[0-7]+$/i,ot=parseInt,ct=1/0,ft=1.7976931348623157e308,at="Expected a function",lt=Math.max,st="Expected a function",pt=s("length"),yt=9007199254740991,ht=Object.prototype,vt=ht.hasOwnProperty,mt=Object.getPrototypeOf,dt=Object.keys,gt="[object Arguments]",bt=Object.prototype,kt=bt.hasOwnProperty,wt=bt.toString,jt=bt.propertyIsEnumerable,St=Array.isArray,Ot="[object String]",Et=Object.prototype,Lt=Et.toString,xt=9007199254740991,At=/^(?:0|[1-9]\d*)$/,Tt=Object.prototype,It=c(x),zt="function"==typeof setImmediate&&setImmediate;Xn=zt?function(n){zt(n)}:"object"==typeof process&&"function"==typeof process.nextTick?process.nextTick:function(n){setTimeout(n,0)};var $t=Xn,Mt=c(A),qt=o(function(n,t){return o(function(r){return n.apply(null,t.concat(r))})}),Bt=$(),Ft=Math.max,Pt=Array.prototype.reverse,Ut=K(J),Ct=V(J),Dt=o(function(n){var t=[null].concat(n);return function(n){return n.apply(this,t)}}),Ht=X(x,q,Y),Nt=X(_,q,Y),Qt=X(A,q,Y),Rt=nn("dir"),Wt=X(x,pn,pn),Gt=X(_,pn,pn),Jt=K(yn),Kt=hn(yn),Vt=V(yn),Xt=nn("log"),Yt=K(dn),Zt=hn(dn),_t=V(dn),nr={"function":!0,object:!0},tr=nr[typeof n]&&n&&!n.nodeType?n:null,rr=nr[typeof module]&&module&&!module.nodeType?module:null,er=gn(tr&&rr&&"object"==typeof global&&global),ur=gn(nr[typeof self]&&self),ir=gn(nr[typeof window]&&window),or=gn(nr[typeof this]&&this),cr=er||ir!==(or&&or.window)&&ir||ur||or||Function("return this")(),fr=cr.Symbol,ar="[object Symbol]",lr=Object.prototype,sr=lr.toString,pr=1/0,yr=fr?fr.prototype:void 0,hr=fr?yr.toString:void 0,vr=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g,mr=/\\(\\)?/g,dr=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,gr=/^\w*$/,br="object"==typeof process&&"function"==typeof process.nextTick?process.nextTick:$t,kr=Array.prototype.slice,wr=K(Un),jr=hn(Un),Sr=V(Un),Or=X(x,Boolean,q),Er=X(_,Boolean,q),Lr=Math.ceil,xr=Math.max,Ar={applyEach:It,applyEachSeries:Mt,apply:qt,asyncify:T,auto:D,cargo:Q,compose:G,concat:Ut,concatSeries:Ct,constant:Dt,detect:Ht,detectLimit:Nt,detectSeries:Qt,dir:Rt,doDuring:rn,doUntil:on,doWhilst:un,during:tn,each:fn,eachLimit:an,eachOf:x,eachOfLimit:_,eachOfSeries:A,eachSeries:ln,ensureAsync:sn,every:Wt,everyLimit:Gt,filter:Jt,filterLimit:Kt,filterSeries:Vt,forever:vn,iterator:mn,log:Xt,map:Yt,mapLimit:Zt,mapSeries:_t,memoize:zn,nextTick:br,parallel:Mn,parallelLimit:qn,priorityQueue:Fn,queue:Bn,reduce:R,reduceRight:Pn,reject:wr,rejectLimit:jr,rejectSeries:Sr,retry:Dn,seq:W,series:Cn,setImmediate:$t,some:Or,someLimit:Er,sortBy:Hn,times:Qn,timesLimit:Rn,timesSeries:Wn,transform:Gn,unmemoize:Jn,until:Kn,waterfall:Vn,whilst:en,all:Wt,any:Or,forEach:fn,forEachSeries:ln,forEachLimit:an,forEachOf:x,forEachOfSeries:A,forEachOfLimit:_,inject:R,foldl:R,foldr:Pn,select:Jt,selectLimit:Kt,selectSeries:Vt,wrapSync:T};n["default"]=Ar,n.applyEach=It,n.applyEachSeries=Mt,n.apply=qt,n.asyncify=T,n.auto=D,n.cargo=Q,n.compose=G,n.concat=Ut,n.concatSeries=Ct,n.constant=Dt,n.detect=Ht,n.detectLimit=Nt,n.detectSeries=Qt,n.dir=Rt,n.doDuring=rn,n.doUntil=on,n.doWhilst=un,n.during=tn,n.each=fn,n.eachLimit=an,n.eachOf=x,n.eachOfLimit=_,n.eachOfSeries=A,n.eachSeries=ln,n.ensureAsync=sn,n.every=Wt,n.everyLimit=Gt,n.filter=Jt,n.filterLimit=Kt,n.filterSeries=Vt,n.forever=vn,n.iterator=mn,n.log=Xt,n.map=Yt,n.mapLimit=Zt,n.mapSeries=_t,n.memoize=zn,n.nextTick=br,n.parallel=Mn,n.parallelLimit=qn,n.priorityQueue=Fn,n.queue=Bn,n.reduce=R,n.reduceRight=Pn,n.reject=wr,n.rejectLimit=jr,n.rejectSeries=Sr,n.retry=Dn,n.seq=W,n.series=Cn,n.setImmediate=$t,n.some=Or,n.someLimit=Er,n.sortBy=Hn,n.times=Qn,n.timesLimit=Rn,n.timesSeries=Wn,n.transform=Gn,n.unmemoize=Jn,n.until=Kn,n.waterfall=Vn,n.whilst=en,n.all=Wt,n.any=Or,n.forEach=fn,n.forEachSeries=ln,n.forEachLimit=an,n.forEachOf=x,n.forEachOfSeries=A,n.forEachOfLimit=_,n.inject=R,n.foldl=R,n.foldr=Pn,n.select=Jt,n.selectLimit=Kt,n.selectSeries=Vt,n.wrapSync=T});
+!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports):"function"==typeof define&&define.amd?define(["exports"],n):n(t.async=t.async||{})}(this,function(t){"use strict";function n(t,n,r){var e=r.length;switch(e){case 0:return t.call(n);case 1:return t.call(n,r[0]);case 2:return t.call(n,r[0],r[1]);case 3:return t.call(n,r[0],r[1],r[2])}return t.apply(n,r)}function r(t){var n=typeof t;return!!t&&("object"==n||"function"==n)}function e(t){var n=r(t)?Vn.call(t):"";return n==Hn||n==Jn}function o(t){if(r(t)){var n=e(t.valueOf)?t.valueOf():t;t=r(n)?n+"":n}if("string"!=typeof t)return 0===t?t:+t;t=t.replace(Yn,"");var o=tr.test(t);return o||nr.test(t)?rr(t.slice(2),o?2:8):Zn.test(t)?Xn:+t}function u(t){if(!t)return 0===t?t:0;if(t=o(t),t===er||t===-er){var n=0>t?-1:1;return n*or}var r=t%1;return t===t?r?t-r:t:0}function i(t,r){if("function"!=typeof t)throw new TypeError(ur);return r=ir(void 0===r?t.length-1:u(r),0),function(){for(var e=arguments,o=-1,u=ir(e.length-r,0),i=Array(u);++o<u;)i[o]=e[r+o];switch(r){case 0:return t.call(this,i);case 1:return t.call(this,e[0],i);case 2:return t.call(this,e[0],e[1],i)}var c=Array(r+1);for(o=-1;++o<r;)c[o]=e[o];return c[r]=i,n(t,this,c)}}function c(t){return i(function(n,r){var e=i(function(r){var e=this,o=r.pop();return t(n,function(t,n,o){t.apply(e,r.concat([o]))},o)});return r.length?e.apply(this,r):e})}function a(){}function f(t,n){var r;if("function"!=typeof n)throw new TypeError(cr);return t=u(t),function(){return--t>0&&(r=n.apply(this,arguments)),1>=t&&(n=void 0),r}}function l(t){return f(2,t)}function s(t){return function(n){return null==n?void 0:n[t]}}function p(t){return"number"==typeof t&&t>-1&&t%1==0&&fr>=t}function y(t){return null!=t&&p(ar(t))&&!e(t)}function h(t,n){return sr.call(t,n)||"object"==typeof t&&n in t&&null===pr(t)}function v(t){return yr(Object(t))}function d(t,n){for(var r=-1,e=Array(t);++r<t;)e[r]=n(r);return e}function m(t){return!!t&&"object"==typeof t}function g(t){return m(t)&&y(t)}function b(t){return g(t)&&dr.call(t,"callee")&&(!gr.call(t,"callee")||mr.call(t)==hr)}function j(t){return"string"==typeof t||!br(t)&&m(t)&&Or.call(t)==jr}function w(t){var n=t?t.length:void 0;return p(n)&&(br(t)||j(t)||b(t))?d(n,String):null}function O(t,n){return t="number"==typeof t||_r.test(t)?+t:-1,n=null==n?Sr:n,t>-1&&t%1==0&&n>t}function S(t){var n=t&&t.constructor,r="function"==typeof n&&n.prototype||kr;return t===r}function _(t){var n=S(t);if(!n&&!y(t))return v(t);var r=w(t),e=!!r,o=r||[],u=o.length;for(var i in t)!h(t,i)||e&&("length"==i||O(i,u))||n&&"constructor"==i||o.push(i);return o}function k(t){var n,r=-1;if(y(t))return n=t.length,function(){return r++,n>r?r:null};var e=_(t);return n=e.length,function(){return r++,n>r?e[r]:null}}function E(t){return function(){if(null===t)throw new Error("Callback was already called.");t.apply(this,arguments),t=null}}function A(t){return function(n,r,e){e=l(e||a),n=n||[];var o=k(n);if(0>=t)return e(null);var u=!1,i=0,c=!1;!function f(){if(u&&0>=i)return e(null);for(;t>i&&!c;){var a=o();if(null===a)return u=!0,void(0>=i&&e(null));i+=1,r(n[a],a,E(function(t){i-=1,t?(e(t),c=!0):f()}))}}()}}function L(t,n,r,e){A(n)(t,r,e)}function x(t,n){return function(r,e,o){return t(r,n,e,o)}}function I(t){return i(function(n){var e,o=n.pop();try{e=t.apply(this,n)}catch(u){return o(u)}r(e)&&"function"==typeof e.then?e.then(function(t){o(null,t)})["catch"](function(t){o(t.message?t:new Error(t))}):o(null,e)})}function T(t,n){for(var r=-1,e=t.length;++r<e&&n(t[r],r,t)!==!1;);return t}function F(t){return t}function M(t){return"function"==typeof t?t:F}function $(t){return function(n,r,e){for(var o=-1,u=Object(n),i=e(n),c=i.length;c--;){var a=i[t?c:++o];if(r(u[a],a,u)===!1)break}return n}}function U(t,n){return t&&Tr(t,n,_)}function P(t,n){return t&&U(t,M(n))}function z(t,n,r){for(var e=t.length,o=n+(r?0:-1);r?o--:++o<e;){var u=t[o];if(u!==u)return o}return-1}function B(t,n,r){if(n!==n)return z(t,r);for(var e=r-1,o=t.length;++e<o;)if(t[e]===n)return e;return-1}function C(t,n,r){var e=t?t.length:0;return e?(r=u(r),0>r&&(r=Fr(e+r,0)),B(t,n,r)):-1}function q(t,n,r){function e(t,n){m.push(function(){f(t,n)})}function o(){if(0===m.length&&0===h)return r(null,y);for(;m.length&&n>h;){var t=m.shift();t()}}function u(t,n){var r=d[t];r||(r=d[t]=[]),r.push(n)}function c(t){var n=d[t]||[];T(n,function(t){t()}),o()}function f(t,n){if(!v){var e=E(i(function(n,e){if(h--,e.length<=1&&(e=e[0]),n){var o={};P(y,function(t,n){o[n]=t}),o[t]=e,v=!0,d=[],r(n,o)}else y[t]=e,c(t)}));h++;var o=n[n.length-1];n.length>1?o(y,e):o(e)}}"function"==typeof n&&(r=n,n=null),r=l(r||a);var s=_(t),p=s.length;if(!p)return r(null);n||(n=p);var y={},h=0,v=!1,d={},m=[];P(t,function(n,r){function o(){for(var n,e=i.length;e--;){if(!(n=t[i[e]]))throw new Error("async.auto task `"+r+"` has non-existent dependency in "+i.join(", "));if(br(n)&&C(n,r)>=0)throw new Error("async.auto task `"+r+"`Has cyclic dependencies")}}if(!br(n))return void e(r,[n]);var i=n.slice(0,n.length-1),c=i.length;o(),T(i,function(t){u(t,function(){c--,0===c&&e(r,n)})})}),o()}function D(t,n){for(var r=-1,e=t.length,o=Array(e);++r<e;)o[r]=n(t[r],r,t);return o}function R(){this.__data__={array:[],map:null}}function W(t,n){return t===n||t!==t&&n!==n}function N(t,n){for(var r=t.length;r--;)if(W(t[r][0],n))return r;return-1}function G(t,n){var r=N(t,n);if(0>r)return!1;var e=t.length-1;return r==e?t.pop():$r.call(t,r,1),!0}function Q(t){var n=this.__data__,r=n.array;return r?G(r,t):n.map["delete"](t)}function H(t,n){var r=N(t,n);return 0>r?void 0:t[r][1]}function J(t){var n=this.__data__,r=n.array;return r?H(r,t):n.map.get(t)}function K(t,n){return N(t,n)>-1}function V(t){var n=this.__data__,r=n.array;return r?K(r,t):n.map.has(t)}function X(t){var n=!1;if(null!=t&&"function"!=typeof t.toString)try{n=!!(t+"")}catch(r){}return n}function Y(t){return null==t?!1:e(t)?qr.test(Br.call(t)):m(t)&&(X(t)?qr:Pr).test(t)}function Z(t,n){var r=t[n];return Y(r)?r:void 0}function tt(){}function nt(t){return t&&t.Object===Object?t:null}function rt(){this.__data__={hash:new tt,map:Xr?new Xr:[],string:new tt}}function et(t,n){return Dr?void 0!==t[n]:Zr.call(t,n)}function ot(t,n){return et(t,n)&&delete t[n]}function ut(t){var n=typeof t;return"number"==n||"boolean"==n||"string"==n&&"__proto__"!=t||null==t}function it(t){var n=this.__data__;return ut(t)?ot("string"==typeof t?n.string:n.hash,t):Xr?n.map["delete"](t):G(n.map,t)}function ct(t,n){if(Dr){var r=t[n];return r===te?void 0:r}return re.call(t,n)?t[n]:void 0}function at(t){var n=this.__data__;return ut(t)?ct("string"==typeof t?n.string:n.hash,t):Xr?n.map.get(t):H(n.map,t)}function ft(t){var n=this.__data__;return ut(t)?et("string"==typeof t?n.string:n.hash,t):Xr?n.map.has(t):K(n.map,t)}function lt(t,n,r){var e=N(t,n);0>e?t.push([n,r]):t[e][1]=r}function st(t,n,r){t[n]=Dr&&void 0===r?ee:r}function pt(t,n){var r=this.__data__;return ut(t)?st("string"==typeof t?r.string:r.hash,t,n):Xr?r.map.set(t,n):lt(r.map,t,n),this}function yt(t){var n=-1,r=t?t.length:0;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function ht(t,n){var r=this.__data__,e=r.array;e&&(e.length<oe-1?lt(e,t,n):(r.array=null,r.map=new yt(e)));var o=r.map;return o&&o.set(t,n),this}function vt(t){var n=-1,r=t?t.length:0;for(this.clear();++n<r;){var e=t[n];this.set(e[0],e[1])}}function dt(t,n,r){var e=t[n];ie.call(t,n)&&W(e,r)&&(void 0!==r||n in t)||(t[n]=r)}function mt(t,n,r,e){r||(r={});for(var o=-1,u=n.length;++o<u;){var i=n[o],c=e?e(r[i],t[i],i,r,t):t[i];dt(r,i,c)}return r}function gt(t,n,r){return mt(t,n,r)}function bt(t,n){return t&&gt(n,_(n),t)}function jt(t,n){if(n)return t.slice();var r=new t.constructor(t.length);return t.copy(r),r}function wt(t,n){var r=-1,e=t.length;for(n||(n=Array(e));++r<e;)n[r]=t[r];return n}function Ot(t,n){return gt(t,ae(t),n)}function St(t){return me.call(t)}function _t(t){var n=t.length,r=t.constructor(n);return n&&"string"==typeof t[0]&&Se.call(t,"index")&&(r.index=t.index,r.input=t.input),r}function kt(t){var n=new t.constructor(t.byteLength);return new _e(n).set(new _e(t)),n}function Et(t,n){return t.set(n[0],n[1]),t}function At(t,n,r,e){var o=-1,u=t.length;for(e&&u&&(r=t[++o]);++o<u;)r=n(r,t[o],o,t);return r}function Lt(t){var n=-1,r=Array(t.size);return t.forEach(function(t,e){r[++n]=[e,t]}),r}function xt(t){return At(Lt(t),Et,new t.constructor)}function It(t){var n=new t.constructor(t.source,ke.exec(t));return n.lastIndex=t.lastIndex,n}function Tt(t,n){return t.add(n),t}function Ft(t){var n=-1,r=Array(t.size);return t.forEach(function(t){r[++n]=t}),r}function Mt(t){return At(Ft(t),Tt,new t.constructor)}function $t(t){return Le?Object(Le.call(t)):{}}function Ut(t,n){var r=n?kt(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}function Pt(t,n,r){var e=t.constructor;switch(n){case ze:return kt(t);case xe:case Ie:return new e(+t);case Be:case Ce:case qe:case De:case Re:case We:case Ne:case Ge:case Qe:return Ut(t,r);case Te:return xt(t);case Fe:case Ue:return new e(t);case Me:return It(t);case $e:return Mt(t);case Pe:return $t(t)}}function zt(t){return r(t)?He(t):{}}function Bt(t){return"function"!=typeof t.constructor||S(t)?{}:zt(Je(t))}function Ct(t){return function(){return t}}function qt(t,n,e,o,u,i,c){var a;if(o&&(a=i?o(t,u,i,c):o(t)),void 0!==a)return a;if(!r(t))return t;var f=br(t);if(f){if(a=_t(t),!n)return wt(t,a)}else{var l=we(t),s=l==io||l==co;if(to(t))return jt(t,n);if(l==lo||l==no||s&&!i){if(X(t))return i?t:{};if(a=Bt(s?{}:t),!n)return a=bt(a,t),e?Ot(t,a):a}else{if(!Ao[l])return i?t:{};a=Pt(t,l,n)}}c||(c=new vt);var p=c.get(t);return p?p:(c.set(t,a),(f?T:U)(t,function(r,u){dt(a,u,qt(r,n,e,o,u,t,c))}),e&&!f?Ot(t,a):a)}function Dt(t){return t.toString().match(xo)[1].split(/\s*\,\s*/)}function Rt(t,n){var r={};P(t,function(t,n){function e(n,r){var e=D(o,function(t){return n[t]});e.push(r),t.apply(null,e)}var o;if(br(t))o=qt(t),t=o.pop(),r[n]=o.concat(e);else{if(0===t.length)throw new Error("autoInject task functions require explicit parameters.");1===t.length?r[n]=t:(o=Dt(t),o.pop(),r[n]=o.concat(e))}}),q(r,n)}function Wt(t,n,r){function e(t,n,r,e){if(null!=e&&"function"!=typeof e)throw new Error("task callback must be a function");return t.started=!0,br(n)||(n=[n]),0===n.length&&t.idle()?To(function(){t.drain()}):(T(n,function(n){var o={data:n,callback:e||a};r?t.tasks.unshift(o):t.tasks.push(o),t.tasks.length===t.concurrency&&t.saturated(),t.tasks.length<=t.concurrency-t.buffer&&t.unsaturated()}),void To(t.process))}function o(t,n){return function(){u-=1;var r=!1,e=arguments;T(n,function(t){T(i,function(n,e){n!==t||r||(i.splice(e,1),r=!0)}),t.callback.apply(t,e)}),t.tasks.length+u===0&&t.drain(),t.process()}}if(null==n)n=1;else if(0===n)throw new Error("Concurrency must not be zero");var u=0,i=[],c={tasks:[],concurrency:n,payload:r,saturated:a,unsaturated:a,buffer:n/4,empty:a,drain:a,started:!1,paused:!1,push:function(t,n){e(c,t,!1,n)},kill:function(){c.drain=a,c.tasks=[]},unshift:function(t,n){e(c,t,!0,n)},process:function(){for(;!c.paused&&u<c.concurrency&&c.tasks.length;){var n=c.payload?c.tasks.splice(0,c.payload):c.tasks.splice(0,c.tasks.length),r=D(n,s("data"));0===c.tasks.length&&c.empty(),u+=1,i.push(n[0]);var e=E(o(c,n));t(r,e)}},length:function(){return c.tasks.length},running:function(){return u},workersList:function(){return i},idle:function(){return c.tasks.length+u===0},pause:function(){c.paused=!0},resume:function(){if(c.paused!==!1){c.paused=!1;for(var t=Math.min(c.concurrency,c.tasks.length),n=1;t>=n;n++)To(c.process)}}};return c}function Nt(t,n){return Wt(t,1,n)}function Gt(t,n,r,e){Lr(t,function(t,e,o){r(n,t,function(t,r){n=r,o(t)})},function(t){e(t,n)})}function Qt(){var t=arguments;return i(function(n){var r=this,e=n[n.length-1];"function"==typeof e?n.pop():e=a,Gt(t,n,function(t,n,e){n.apply(r,t.concat([i(function(t,n){e(t,n)})]))},function(t,n){e.apply(r,[t].concat(n))})})}function Ht(){return Qt.apply(null,Fo.call(arguments))}function Jt(t,n,r,e){var o=[];t(n,function(t,n,e){r(t,function(t,n){o=o.concat(n||[]),e(t)})},function(t){e(t,o)})}function Kt(t){return function(n,r,e){return t(Er,n,r,e)}}function Vt(t){return function(n,r,e){return t(Lr,n,r,e)}}function Xt(t,n,r){return function(e,o,u,i){function c(t){i&&(t?i(t):i(null,r(!1)))}function a(t,e,o){return i?void u(t,function(e,c){i&&(e?(i(e),i=u=!1):n(c)&&(i(null,r(!0,t)),i=u=!1)),o()}):o()}arguments.length>3?t(e,o,a,c):(i=u,u=o,t(e,a,c))}}function Yt(t,n){return n}function Zt(t){return i(function(n,r){n.apply(null,r.concat([i(function(n,r){"object"==typeof console&&(n?console.error&&console.error(n):console[t]&&T(r,function(n){console[t](n)}))})]))})}function tn(t,n,r){r=r||a;var e=i(function(n,e){n?r(n):(e.push(o),t.apply(this,e))}),o=function(t,o){return t?r(t):o?void n(e):r(null)};t(o)}function nn(t,n,r){var e=0;tn(function(t){return e++<1?t(null,!0):void n.apply(this,arguments)},t,r)}function rn(t,n,r){if(r=r||a,!t())return r(null);var e=i(function(o,u){return o?r(o):t.apply(this,u)?n(e):void r.apply(null,[null].concat(u))});n(e)}function en(t,n,r){var e=0;return rn(function(){return++e<=1||n.apply(this,arguments)},t,r)}function on(t,n,r){return en(t,function(){return!n.apply(this,arguments)},r)}function un(t){return function(n,r,e){return t(n,e)}}function cn(t,n,r,e){return A(n)(t,un(r),e)}function an(t){return i(function(n){var r=n.pop(),e=!0;n.push(function(){var t=arguments;e?To(function(){r.apply(null,t)}):r.apply(null,t)}),t.apply(this,n),e=!1})}function fn(t){return!t}function ln(t,n,r,e){var o=[];t(n,function(t,n,e){r(t,function(r,u){r?e(r):(u&&o.push({index:n,value:t}),e())})},function(t){t?e(t):e(null,D(o.sort(function(t,n){return t.index-n.index}),s("value")))})}function sn(t){return function(n,r,e,o){return t(A(r),n,e,o)}}function pn(t,n){function r(t){return t?e(t):void o(r)}var e=E(n||a),o=an(t);r()}function yn(t){function n(r){function e(){return t.length&&t[r].apply(null,arguments),e.next()}return e.next=function(){return r<t.length-1?n(r+1):null},e}return n(0)}function hn(t,n,r,e){e=l(e||a),n=n||[];var o=y(n)?[]:{};t(n,function(t,n,e){r(t,function(t,r){o[n]=r,e(t)})},function(t){e(t,o)})}function vn(t){return"symbol"==typeof t||m(t)&&tu.call(t)==Yo}function dn(t){if("string"==typeof t)return t;if(null==t)return"";if(vn(t))return eu?eu.call(t):"";var n=t+"";return"0"==n&&1/t==-nu?"-0":n}function mn(t){var n=[];return dn(t).replace(ou,function(t,r,e,o){n.push(e?o.replace(uu,"$1"):r||t)}),n}function gn(t){return br(t)?t:mn(t)}function bn(t,n){return"number"==typeof t?!0:!br(t)&&(cu.test(t)||!iu.test(t)||null!=n&&t in Object(n))}function jn(t){var n=t?t.length:0;return n?t[n-1]:void 0}function wn(t,n,r){var e=-1,o=t.length;0>n&&(n=-n>o?0:o+n),r=r>o?o:r,0>r&&(r+=o),o=n>r?0:r-n>>>0,n>>>=0;for(var u=Array(o);++e<o;)u[e]=t[e+n];return u}function On(t,n){n=bn(n,t)?[n+""]:gn(n);for(var r=0,e=n.length;null!=t&&e>r;)t=t[n[r++]];return r&&r==e?t:void 0}function Sn(t,n,r){var e=null==t?void 0:On(t,n);return void 0===e?r:e}function _n(t,n){return 1==n.length?t:Sn(t,wn(n,0,-1))}function kn(t,n,r){if(null==t)return!1;var e=r(t,n);e||bn(n)||(n=gn(n),t=_n(t,n),null!=t&&(n=jn(n),e=r(t,n)));var o=t?t.length:void 0;return e||!!o&&p(o)&&O(n,o)&&(br(t)||j(t)||b(t))}function En(t,n){return kn(t,n,h)}function An(t,n){var r=Object.create(null),e=Object.create(null);n=n||F;var o=i(function(o){var u=o.pop(),c=n.apply(null,o);En(r,c)?To(function(){u.apply(null,r[c])}):En(e,c)?e[c].push(u):(e[c]=[u],t.apply(null,o.concat([i(function(t){r[c]=t;var n=e[c];delete e[c];for(var o=0,u=n.length;u>o;o++)n[o].apply(null,t)})])))});return o.memo=r,o.unmemoized=t,o}function Ln(t,n,r){r=r||a;var e=y(n)?[]:{};t(n,function(t,n,r){t(i(function(t,o){o.length<=1&&(o=o[0]),e[n]=o,r(t)}))},function(t){r(t,e)})}function xn(t,n,r){return Ln(A(n),t,r)}function In(t,n){return Wt(function(n,r){t(n[0],r)},n,1)}function Tn(t,n){function r(t,n){return t.priority-n.priority}function e(t,n,r){for(var e=-1,o=t.length-1;o>e;){var u=e+(o-e+1>>>1);r(n,t[u])>=0?e=u:o=u-1}return e}function o(t,n,o,u){if(null!=u&&"function"!=typeof u)throw new Error("task callback must be a function");return t.started=!0,br(n)||(n=[n]),0===n.length?To(function(){t.drain()}):void T(n,function(n){var i={data:n,priority:o,callback:"function"==typeof u?u:a};t.tasks.splice(e(t.tasks,i,r)+1,0,i),t.tasks.length===t.concurrency&&t.saturated(),t.tasks.length<=t.concurrency-t.buffer&&t.unsaturated(),To(t.process)})}var u=In(t,n);return u.push=function(t,n,r){o(u,t,n,r)},delete u.unshift,u}function Fn(t,n){return function(r,e){if(null==r)return r;if(!y(r))return t(r,e);for(var o=r.length,u=n?o:-1,i=Object(r);(n?u--:++u<o)&&e(i[u],u,i)!==!1;);return r}}function Mn(t,n){return"function"==typeof n&&br(t)?T(t,n):fu(t,M(n))}function $n(t,n){return n=l(n||a),br(t)?t.length?void Mn(t,function(t){t(n)}):n():n(new TypeError("First argument to race must be an array of functions"))}function Un(t,n,r,e){var o=lu.call(t).reverse();Gt(o,n,r,e)}function Pn(t,n,r,e){ln(t,n,function(t,n){r(t,function(t,r){t?n(t):n(null,!r)})},e)}function zn(t,n){return Ln(Lr,t,n)}function Bn(t,n,r){function e(t,n){if("object"==typeof n)t.times=+n.times||i,t.interval=+n.interval||c;else{if("number"!=typeof n&&"string"!=typeof n)throw new Error("Invalid arguments for async.retry");t.times=+n||i}}function o(t){return function(r){n(function(n,e){r(!n||t,{err:n,result:e})})}}function u(t){return function(n){setTimeout(function(){n(null)},t)}}var i=5,c=0,f={times:i,interval:c};if(arguments.length<3&&"function"==typeof t?(r=n||a,n=t):(e(f,t),r=r||a),"function"!=typeof n)throw new Error("Invalid arguments for async.retry");for(var l=[];f.times;){var s=!(f.times-=1);l.push(o(s)),!s&&f.interval>0&&l.push(u(f.interval))}zn(l,function(t,n){n=n[n.length-1],r(n.err,n.result)})}function Cn(t,n,r){function e(t,n){var r=t.criteria,e=n.criteria;return e>r?-1:r>e?1:0}Vo(t,function(t,r){n(t,function(n,e){return n?r(n):void r(null,{value:t,criteria:e})})},function(t,n){return t?r(t):void r(null,D(n.sort(e),s("value")))})}function qn(t,n){function r(){a||(i.apply(null,arguments),clearTimeout(c))}function e(){var t=new Error("Callback function timed out.");t.code="ETIMEDOUT",a=!0,i(t)}function o(t){var n=Array.prototype.slice.call(t,0);return i=n[n.length-1],n[n.length-1]=r,n}function u(){c=setTimeout(e,n),t.apply(null,o(arguments))}var i,c,a=!1;return u}function Dn(t,n,r,e){for(var o=-1,u=gu(mu((n-t)/(r||1)),0),i=Array(u);u--;)i[e?u:++o]=t,t+=r;return i}function Rn(t,n,r,e){return Ko(Dn(0,t,1),n,r,e)}function Wn(t,n,r,e){3===arguments.length&&(e=r,r=n,n=br(t)?[]:{}),Er(t,function(t,e,o){r(n,t,e,o)},function(t){e(t,n)})}function Nn(t){return function(){return(t.unmemoized||t).apply(null,arguments)}}function Gn(t,n,r){return rn(function(){return!t.apply(this,arguments)},n,r)}function Qn(t,n){function r(o){if(e===t.length)return n.apply(null,[null].concat(o));var u=E(i(function(t,e){return t?n.apply(null,[t].concat(e)):void r(e)}));o.push(u);var c=t[e++];c.apply(null,o)}if(n=l(n||a),!br(t))return n(new Error("First argument to waterfall must be an array of functions"));if(!t.length)return n();var e=0;r([])}var Hn="[object Function]",Jn="[object GeneratorFunction]",Kn=Object.prototype,Vn=Kn.toString,Xn=NaN,Yn=/^\s+|\s+$/g,Zn=/^[-+]0x[0-9a-f]+$/i,tr=/^0b[01]+$/i,nr=/^0o[0-7]+$/i,rr=parseInt,er=1/0,or=1.7976931348623157e308,ur="Expected a function",ir=Math.max,cr="Expected a function",ar=s("length"),fr=9007199254740991,lr=Object.prototype,sr=lr.hasOwnProperty,pr=Object.getPrototypeOf,yr=Object.keys,hr="[object Arguments]",vr=Object.prototype,dr=vr.hasOwnProperty,mr=vr.toString,gr=vr.propertyIsEnumerable,br=Array.isArray,jr="[object String]",wr=Object.prototype,Or=wr.toString,Sr=9007199254740991,_r=/^(?:0|[1-9]\d*)$/,kr=Object.prototype,Er=x(L,1/0),Ar=c(Er),Lr=x(L,1),xr=c(Lr),Ir=i(function(t,n){return i(function(r){return t.apply(null,n.concat(r))})}),Tr=$(),Fr=Math.max,Mr=Array.prototype,$r=Mr.splice,Ur=/[\\^$.*+?()[\]{}|]/g,Pr=/^\[object .+?Constructor\]$/,zr=Object.prototype,Br=Function.prototype.toString,Cr=zr.hasOwnProperty,qr=RegExp("^"+Br.call(Cr).replace(Ur,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$"),Dr=Z(Object,"create"),Rr=Object.prototype;tt.prototype=Dr?Dr(null):Rr;var Wr={"function":!0,object:!0},Nr=Wr[typeof t]&&t&&!t.nodeType?t:void 0,Gr=Wr[typeof module]&&module&&!module.nodeType?module:void 0,Qr=nt(Nr&&Gr&&"object"==typeof global&&global),Hr=nt(Wr[typeof self]&&self),Jr=nt(Wr[typeof window]&&window),Kr=nt(Wr[typeof this]&&this),Vr=Qr||Jr!==(Kr&&Kr.window)&&Jr||Hr||Kr||Function("return this")(),Xr=Z(Vr,"Map"),Yr=Object.prototype,Zr=Yr.hasOwnProperty,te="__lodash_hash_undefined__",ne=Object.prototype,re=ne.hasOwnProperty,ee="__lodash_hash_undefined__";yt.prototype.clear=rt,yt.prototype["delete"]=it,yt.prototype.get=at,yt.prototype.has=ft,yt.prototype.set=pt;var oe=200;vt.prototype.clear=R,vt.prototype["delete"]=Q,vt.prototype.get=J,vt.prototype.has=V,vt.prototype.set=ht;var ue=Object.prototype,ie=ue.hasOwnProperty,ce=Object.getOwnPropertySymbols,ae=ce||function(){return[]},fe=Z(Vr,"Set"),le=Z(Vr,"WeakMap"),se="[object Map]",pe="[object Object]",ye="[object Set]",he="[object WeakMap]",ve=Object.prototype,de=Function.prototype.toString,me=ve.toString,ge=Xr?de.call(Xr):"",be=fe?de.call(fe):"",je=le?de.call(le):"";(Xr&&St(new Xr)!=se||fe&&St(new fe)!=ye||le&&St(new le)!=he)&&(St=function(t){var n=me.call(t),r=n==pe?t.constructor:null,e="function"==typeof r?de.call(r):"";if(e)switch(e){case ge:return se;case be:return ye;case je:return he}return n});var we=St,Oe=Object.prototype,Se=Oe.hasOwnProperty,_e=Vr.Uint8Array,ke=/\w*$/,Ee=Vr.Symbol,Ae=Ee?Ee.prototype:void 0,Le=Ae?Ae.valueOf:void 0,xe="[object Boolean]",Ie="[object Date]",Te="[object Map]",Fe="[object Number]",Me="[object RegExp]",$e="[object Set]",Ue="[object String]",Pe="[object Symbol]",ze="[object ArrayBuffer]",Be="[object Float32Array]",Ce="[object Float64Array]",qe="[object Int8Array]",De="[object Int16Array]",Re="[object Int32Array]",We="[object Uint8Array]",Ne="[object Uint8ClampedArray]",Ge="[object Uint16Array]",Qe="[object Uint32Array]",He=Object.create,Je=Object.getPrototypeOf,Ke={"function":!0,object:!0},Ve=Ke[typeof t]&&t&&!t.nodeType?t:void 0,Xe=Ke[typeof module]&&module&&!module.nodeType?module:void 0,Ye=Xe&&Xe.exports===Ve?Ve:void 0,Ze=Ye?Vr.Buffer:void 0,to=Ze?function(t){return t instanceof Ze}:Ct(!1),no="[object Arguments]",ro="[object Array]",eo="[object Boolean]",oo="[object Date]",uo="[object Error]",io="[object Function]",co="[object GeneratorFunction]",ao="[object Map]",fo="[object Number]",lo="[object Object]",so="[object RegExp]",po="[object Set]",yo="[object String]",ho="[object Symbol]",vo="[object WeakMap]",mo="[object ArrayBuffer]",go="[object Float32Array]",bo="[object Float64Array]",jo="[object Int8Array]",wo="[object Int16Array]",Oo="[object Int32Array]",So="[object Uint8Array]",_o="[object Uint8ClampedArray]",ko="[object Uint16Array]",Eo="[object Uint32Array]",Ao={};Ao[no]=Ao[ro]=Ao[mo]=Ao[eo]=Ao[oo]=Ao[go]=Ao[bo]=Ao[jo]=Ao[wo]=Ao[Oo]=Ao[ao]=Ao[fo]=Ao[lo]=Ao[so]=Ao[po]=Ao[yo]=Ao[ho]=Ao[So]=Ao[_o]=Ao[ko]=Ao[Eo]=!0,Ao[uo]=Ao[io]=Ao[vo]=!1;var Lo,xo=/^function\s*[^\(]*\(\s*([^\)]*)\)/m,Io="function"==typeof setImmediate&&setImmediate;Lo=Io?Io:"object"==typeof process&&"function"==typeof process.nextTick?process.nextTick:function(t){setTimeout(t,0)};var To=i(function(t,n){Lo(function(){t.apply(null,n)})}),Fo=Array.prototype.reverse,Mo=Kt(Jt),$o=Vt(Jt),Uo=i(function(t){var n=[null].concat(t);return function(){var t=[].slice.call(arguments).pop();return t.apply(this,n)}}),Po=Xt(Er,F,Yt),zo=Xt(L,F,Yt),Bo=Xt(Lr,F,Yt),Co=Zt("dir"),qo=x(cn,1/0),Do=x(cn,1),Ro=Xt(L,fn,fn),Wo=x(Ro,1/0),No=x(Ro,1),Go=sn(ln),Qo=x(Go,1/0),Ho=x(Go,1),Jo=Zt("log"),Ko=sn(hn),Vo=x(Ko,1/0),Xo=x(Ko,1),Yo="[object Symbol]",Zo=Object.prototype,tu=Zo.toString,nu=1/0,ru=Ee?Ee.prototype:void 0,eu=ru?ru.toString:void 0,ou=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]/g,uu=/\\(\\)?/g,iu=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,cu=/^\w*$/,au=x(xn,1/0),fu=Fn(U),lu=Array.prototype.slice,su=sn(Pn),pu=x(su,1/0),yu=x(su,1),hu=Xt(L,Boolean,F),vu=x(hu,1/0),du=x(hu,1),mu=Math.ceil,gu=Math.max,bu=x(Rn,1/0),ju=x(Rn,1),wu={applyEach:Ar,applyEachSeries:xr,apply:Ir,asyncify:I,auto:q,autoInject:Rt,cargo:Nt,compose:Ht,concat:Mo,concatSeries:$o,constant:Uo,detect:Po,detectLimit:zo,detectSeries:Bo,dir:Co,doDuring:nn,doUntil:on,doWhilst:en,during:tn,each:qo,eachLimit:cn,eachOf:Er,eachOfLimit:L,eachOfSeries:Lr,eachSeries:Do,ensureAsync:an,every:Wo,everyLimit:Ro,everySeries:No,filter:Qo,filterLimit:Go,filterSeries:Ho,forever:pn,iterator:yn,log:Jo,map:Vo,mapLimit:Ko,mapSeries:Xo,memoize:An,nextTick:To,parallel:au,parallelLimit:xn,priorityQueue:Tn,queue:In,race:$n,reduce:Gt,reduceRight:Un,reject:pu,rejectLimit:su,rejectSeries:yu,retry:Bn,seq:Qt,series:zn,setImmediate:To,some:vu,someLimit:hu,someSeries:du,sortBy:Cn,timeout:qn,times:bu,timesLimit:Rn,timesSeries:ju,transform:Wn,unmemoize:Nn,until:Gn,waterfall:Qn,whilst:rn,all:Wo,any:vu,forEach:qo,forEachSeries:Do,forEachLimit:cn,forEachOf:Er,forEachOfSeries:Lr,forEachOfLimit:L,inject:Gt,foldl:Gt,foldr:Un,select:Qo,selectLimit:Go,selectSeries:Ho,wrapSync:I};t["default"]=wu,t.applyEach=Ar,t.applyEachSeries=xr,t.apply=Ir,t.asyncify=I,t.auto=q,t.autoInject=Rt,t.cargo=Nt,t.compose=Ht,t.concat=Mo,t.concatSeries=$o,t.constant=Uo,t.detect=Po,t.detectLimit=zo,t.detectSeries=Bo,t.dir=Co,t.doDuring=nn,t.doUntil=on,t.doWhilst=en,t.during=tn,t.each=qo,t.eachLimit=cn,t.eachOf=Er,t.eachOfLimit=L,t.eachOfSeries=Lr,t.eachSeries=Do,t.ensureAsync=an,t.every=Wo,t.everyLimit=Ro,t.everySeries=No,t.filter=Qo,t.filterLimit=Go,t.filterSeries=Ho,t.forever=pn,t.iterator=yn,t.log=Jo,t.map=Vo,t.mapLimit=Ko,t.mapSeries=Xo,t.memoize=An,t.nextTick=To,t.parallel=au,t.parallelLimit=xn,t.priorityQueue=Tn,t.queue=In,t.race=$n,t.reduce=Gt,t.reduceRight=Un,t.reject=pu,t.rejectLimit=su,t.rejectSeries=yu,t.retry=Bn,t.seq=Qt,t.series=zn,t.setImmediate=To,t.some=vu,t.someLimit=hu,t.someSeries=du,t.sortBy=Cn,t.timeout=qn,t.times=bu,t.timesLimit=Rn,t.timesSeries=ju,t.transform=Wn,t.unmemoize=Nn,t.until=Gn,t.waterfall=Qn,t.whilst=rn,t.all=Wo,t.allLimit=Ro,t.allSeries=No,t.any=vu,t.anyLimit=hu,t.anySeries=du,t.find=Po,t.findLimit=zo,t.findSeries=Bo,t.forEach=qo,t.forEachSeries=Do,t.forEachLimit=cn,t.forEachOf=Er,t.forEachOfSeries=Lr,t.forEachOfLimit=L,t.inject=Gt,t.foldl=Gt,t.foldr=Un,t.select=Qo,t.selectLimit=Go,t.selectSeries=Ho,t.wrapSync=I});
//# sourceMappingURL=dist/async.min.map \ No newline at end of file
diff --git a/dist/async.min.map b/dist/async.min.map
index 9156fcc..5dd3102 100644
--- a/dist/async.min.map
+++ b/dist/async.min.map
@@ -1 +1 @@
-{"version":3,"file":"build/dist/async.min.js","sources":["build/dist/async.js"],"names":["global","factory","exports","module","define","amd","async","this","apply$1","func","thisArg","args","length","call","apply","isObject","value","type","isFunction","tag","objectToString$2","funcTag","genTag","toNumber","other","valueOf","replace","reTrim","isBinary","reIsBinary","test","reIsOctal","freeParseInt","slice","reIsBadHex","NAN","toInteger","INFINITY","sign","MAX_INTEGER","remainder","rest","start","TypeError","FUNC_ERROR_TEXT","nativeMax","undefined","arguments","index","array","Array","otherArgs","applyEach$1","eachfn","fns","go","that","callback","pop","fn","_","cb","concat","before","n","result","FUNC_ERROR_TEXT$1","once","noop","baseProperty","key","object","isLength","MAX_SAFE_INTEGER$1","isArrayLike","getLength","baseHas","hasOwnProperty","getPrototypeOf","baseKeys","nativeKeys","Object","baseTimes","iteratee","isObjectLike","isArrayLikeObject","isArguments","hasOwnProperty$1","propertyIsEnumerable","objectToString","argsTag","isString","isArray","objectToString$1","stringTag","indexKeys","String","isIndex","reIsUint","MAX_SAFE_INTEGER","isPrototype","Ctor","constructor","proto","prototype","objectProto$1","keys","isProto","indexes","skipIndexes","push","keyIterator","coll","len","i","okeys","onlyOnce","Error","eachOf","iterator","done","err","completed","iter","eachOfSeries","obj","iterate","sync","nextKey","setImmediate$1","asyncify","e","then","message","arrayEach","arrayEvery","predicate","createBaseFor","fromRight","keysFunc","iterable","props","baseForOwn","baseFor","identity","toFunction","forOwn","indexOfNaN","fromIndex","baseIndexOf","indexOf","nativeMax$1","auto","tasks","concurrency","addListener","listeners","unshift","removeListener","idx","splice","taskComplete","remainingTasks","keys$$","results","runningTasks","hasError","k","ready","requires","x","listener","task","taskCallback","dep","safeResults","val","rkey","join","arrayMap","queue$1","worker","payload","_insert","q","data","pos","started","idle","drain","item","saturated","process","_next","workers","removed","workersList","empty","paused","kill","running","pause","resume","resumeCount","Math","min","w","cargo","reduce","arr","memo","v","seq","newargs","nextargs","compose","reverse","concat$1","y","doParallel","doSeries","_createTester","check","getResult","limit","_findGetResult","_eachOfLimit","errored","replenish","eachOfLimit","consoleFunc","name","console","error","during","next","truth","doDuring","calls","whilst","doWhilst","doUntil","_withoutIndex","each","eachLimit","eachSeries","ensureAsync","innerArgs","notId","_filter","sort","a","b","doParallelLimit","forever","makeCallback","_asyncMap","checkGlobal","isSymbol","objectToString$3","symbolTag","toString","Symbol","symbolToString","INFINITY$1","stringToPath","string","rePropName","match","number","quote","reEscapeChar","baseToPath","isKey","reIsPlainProp","reIsDeepProp","last","baseSlice","end","baseGet","path","get","defaultValue","parent","hasPath","hasFunc","has","memoize","hasher","create","queues","memoized","l","unmemoized","_parallel","parallel","parallelLimit","queue","items","priorityQueue","_compareTasks","priority","_binarySearch","sequence","compare","beg","mid","reduceRight","reversed","reject$1","series","retry","times","parseTimes","acc","t","parseInt","DEFAULT_TIMES","interval","DEFAULT_INTERVAL","wrappedTask","wrappedCallback","wrappedResults","retryAttempt","finalAttempt","seriesCallback","retryInterval","setTimeout","opts","attempts","sortBy","comparator","left","right","criteria","map","baseRange","step","nativeMax$2","nativeCeil","count","timeLimit","mapLimit","timesSeries","mapSeries","transform","unmemoize","until","waterfall","wrapIterator","_delay","objectProto$4","max","objectProto","objectProto$2","objectProto$3","applyEach","_setImmediate","setImmediate","nextTick","applyEachSeries","callArgs","concatSeries","constant","values","detect","detectLimit","detectSeries","dir","every","everyLimit","filter","filterLimit","filterSeries","log","objectTypes","function","freeExports","nodeType","freeModule","freeGlobal","freeSelf","self","freeWindow","window","thisGlobal","root","Function","objectProto$5","symbolProto","nexTick","reject","rejectLimit","rejectSeries","some","Boolean","someLimit","ceil","timesLimit","all","any","forEach","forEachSeries","forEachLimit","forEachOf","forEachOfSeries","forEachOfLimit","inject","foldl","foldr","select","selectLimit","selectSeries","wrapSync"],"mappings":"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"} \ No newline at end of file
+{"version":3,"file":"build/dist/async.min.js","sources":["build/dist/async.js"],"names":["global","factory","exports","module","define","amd","async","this","apply","func","thisArg","args","length","call","isObject","value","type","isFunction","tag","objectToString","funcTag","genTag","toNumber","other","valueOf","replace","reTrim","isBinary","reIsBinary","test","reIsOctal","freeParseInt","slice","reIsBadHex","NAN","toInteger","INFINITY","sign","MAX_INTEGER","remainder","rest","start","TypeError","FUNC_ERROR_TEXT","nativeMax","undefined","arguments","index","array","Array","otherArgs","applyEach$1","eachfn","fns","go","that","callback","pop","fn","_","cb","concat","noop","before","n","result","FUNC_ERROR_TEXT$1","once","baseProperty","key","object","isLength","MAX_SAFE_INTEGER","isArrayLike","getLength","baseHas","hasOwnProperty","getPrototypeOf","baseKeys","nativeKeys","Object","baseTimes","iteratee","isObjectLike","isArrayLikeObject","isArguments","hasOwnProperty$1","propertyIsEnumerable","objectToString$1","argsTag","isString","isArray","objectToString$2","stringTag","indexKeys","String","isIndex","reIsUint","MAX_SAFE_INTEGER$1","isPrototype","Ctor","constructor","proto","prototype","objectProto$4","keys","isProto","indexes","skipIndexes","push","keyIterator","coll","len","i","okeys","onlyOnce","Error","_eachOfLimit","limit","obj","iterator","nextKey","done","running","errored","replenish","err","eachOfLimit","doLimit","iterable","asyncify","e","then","message","arrayEach","identity","baseCastFunction","createBaseFor","fromRight","keysFunc","props","baseForOwn","baseFor","forOwn","indexOfNaN","fromIndex","baseIndexOf","indexOf","nativeMax$1","auto","tasks","concurrency","enqueueTask","task","readyTasks","runTask","processQueue","runningTasks","results","run","shift","addListener","taskName","taskListeners","listeners","taskComplete","hasError","taskCallback","safeResults","val","rkey","taskFn","keys$$","numTasks","checkForDeadlocks","dep","dependencies","join","remainingDependencies","dependencyName","arrayMap","stackClear","__data__","map","eq","assocIndexOf","assocDelete","lastIndex","splice","stackDelete","data","assocGet","stackGet","get","assocHas","stackHas","has","isHostObject","toString","isNative","reIsNative","funcToString","reIsHostCtor","getNative","Hash","checkGlobal","mapClear","hash","Map","string","hashHas","nativeCreate","hasOwnProperty$3","hashDelete","isKeyable","mapDelete","hashGet","HASH_UNDEFINED","hasOwnProperty$4","mapGet","mapHas","assocSet","hashSet","HASH_UNDEFINED$1","mapSet","set","MapCache","values","clear","entry","stackSet","LARGE_ARRAY_SIZE","Stack","assignValue","objValue","hasOwnProperty$5","copyObjectWith","source","customizer","newValue","copyObject","baseAssign","cloneBuffer","buffer","isDeep","copy","copyArray","copySymbols","getSymbols","getTag","objectToString$3","initCloneArray","hasOwnProperty$6","input","cloneArrayBuffer","arrayBuffer","byteLength","Uint8Array","addMapEntry","pair","arrayReduce","accumulator","initAccum","mapToArray","size","forEach","cloneMap","cloneRegExp","regexp","reFlags","exec","addSetEntry","add","setToArray","cloneSet","cloneSymbol","symbol","symbolValueOf","cloneTypedArray","typedArray","byteOffset","initCloneByTag","arrayBufferTag$1","boolTag$1","dateTag$1","float32Tag$1","float64Tag$1","int8Tag$1","int16Tag$1","int32Tag$1","uint8Tag$1","uint8ClampedTag$1","uint16Tag$1","uint32Tag$1","mapTag$2","numberTag$1","stringTag$2","regexpTag$1","setTag$2","symbolTag$1","baseCreate","objectCreate","initCloneObject","getPrototypeOf$1","constant","baseClone","isFull","stack","isArr","getTag$1","isFunc","funcTag$1","genTag$1","isBuffer","objectTag","argsTag$1","cloneableTags","stacked","subValue","parseParams","match","argsRegex","split","autoInject","newTasks","newTask","taskCb","newArgs","params","name","queue","worker","payload","_insert","q","pos","started","idle","setImmediate$1","drain","item","unshift","saturated","unsaturated","process","_next","workers","removed","workersList","empty","paused","kill","pause","resume","resumeCount","Math","min","w","cargo","reduce","arr","memo","eachOfSeries","x","v","seq","newargs","nextargs","compose","reverse","concat$1","y","doParallel","eachOf","doSeries","_createTester","check","getResult","_findGetResult","consoleFunc","console","error","during","next","truth","doDuring","calls","whilst","doWhilst","doUntil","_withoutIndex","eachLimit","ensureAsync","sync","innerArgs","notId","_filter","sort","a","b","doParallelLimit","forever","makeCallback","_asyncMap","isSymbol","objectToString$4","symbolTag$2","symbolToString","INFINITY$1","stringToPath","rePropName","number","quote","reEscapeChar","baseCastPath","isKey","reIsPlainProp","reIsDeepProp","last","baseSlice","end","baseGet","path","defaultValue","parent","hasPath","hasFunc","memoize","hasher","create","queues","memoized","l","unmemoized","_parallel","parallelLimit","queue$1","items","priorityQueue","_compareTasks","priority","_binarySearch","sequence","compare","beg","mid","createBaseEach","eachFunc","collection","baseEach","race","reduceRight","reversed","reject$1","series","retry","times","parseTimes","acc","t","DEFAULT_TIMES","interval","DEFAULT_INTERVAL","retryAttempt","isFinalAttempt","seriesCallback","retryInterval","setTimeout","opts","attempts","sortBy","comparator","left","right","criteria","timeout","asyncFn","miliseconds","injectedCallback","timedOut","originalCallback","clearTimeout","timer","timeoutCallback","code","injectCallback","asyncFnArgs","wrappedFn","baseRange","step","nativeMax$2","nativeCeil","timeLimit","count","mapLimit","transform","k","unmemoize","until","waterfall","nextTask","taskIndex","objectProto","parseInt","max","objectProto$1","objectProto$2","objectProto$3","Infinity","applyEach","applyEachSeries","apply$1","callArgs","arrayProto","reRegExpChar","objectProto$6","Function","hasOwnProperty$2","RegExp","objectProto$5","objectTypes","function","freeExports","nodeType","freeModule","freeGlobal","freeSelf","self","freeWindow","window","thisGlobal","root","objectProto$7","objectProto$8","objectProto$9","getOwnPropertySymbols","Set","WeakMap","mapTag$1","objectTag$1","setTag$1","weakMapTag$1","objectProto$10","funcToString$1","mapCtorString","setCtorString","weakMapCtorString","ctorString","objectProto$11","Symbol","symbolProto","objectTypes$1","freeExports$1","freeModule$1","moduleExports","Buffer","arrayTag","boolTag","dateTag","errorTag","mapTag","numberTag","regexpTag","setTag","stringTag$1","symbolTag","weakMapTag","arrayBufferTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","_defer","_setImmediate","setImmediate","nextTick","concatSeries","constant$1","detect","detectLimit","detectSeries","dir","each","eachSeries","everyLimit","every","everySeries","filterLimit","filter","filterSeries","log","mapSeries","objectProto$12","symbolProto$1","parallel","rejectLimit","reject","rejectSeries","someLimit","Boolean","some","someSeries","ceil","timesSeries","timesLimit","all","any","forEachSeries","forEachLimit","forEachOf","forEachOfSeries","forEachOfLimit","inject","foldl","foldr","select","selectLimit","selectSeries","wrapSync","allLimit","allSeries","anyLimit","anySeries","find","findLimit","findSeries"],"mappings":"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"} \ No newline at end of file
diff --git a/lib/auto.js b/lib/auto.js
index ae3ecfc..22e2af2 100644
--- a/lib/auto.js
+++ b/lib/auto.js
@@ -1,8 +1,6 @@
'use strict';
import arrayEach from 'lodash/_arrayEach';
-import arrayEvery from 'lodash/_arrayEvery';
-import baseHas from 'lodash/_baseHas';
import forOwn from 'lodash/forOwn';
import indexOf from 'lodash/indexOf';
import isArray from 'lodash/isArray';
@@ -10,57 +8,113 @@ import okeys from 'lodash/keys';
import noop from 'lodash/noop';
import once from 'lodash/once';
import rest from 'lodash/rest';
-import onlyOnce from './internal/onlyOnce';
-import setImmediate from './internal/setImmediate';
+import onlyOnce from './internal/onlyOnce';
export default function (tasks, concurrency, callback) {
- if (typeof arguments[1] === 'function') {
+ if (typeof concurrency === 'function') {
// concurrency is optional, shift the args.
callback = concurrency;
concurrency = null;
}
callback = once(callback || noop);
var keys = okeys(tasks);
- var remainingTasks = keys.length;
- if (!remainingTasks) {
+ var numTasks = keys.length;
+ if (!numTasks) {
return callback(null);
}
if (!concurrency) {
- concurrency = remainingTasks;
+ concurrency = numTasks;
}
var results = {};
var runningTasks = 0;
var hasError = false;
- var listeners = [];
+ var listeners = {};
+
+ var readyTasks = [];
+
- function addListener(fn) {
- listeners.unshift(fn);
+ forOwn(tasks, function (task, key) {
+ if (!isArray(task)) {
+ // no dependencies
+ enqueueTask(key, [task]);
+ return;
+ }
+
+ var dependencies = task.slice(0, task.length - 1);
+ var remainingDependencies = dependencies.length;
+
+ checkForDeadlocks();
+
+ function checkForDeadlocks() {
+ var len = dependencies.length;
+ var dep;
+ while (len--) {
+ if (!(dep = tasks[dependencies[len]])) {
+ throw new Error('async.auto task `' + key +
+ '` has non-existent dependency in ' +
+ dependencies.join(', '));
+ }
+ if (isArray(dep) && indexOf(dep, key) >= 0) {
+ throw new Error('async.auto task `' + key +
+ '`Has cyclic dependencies');
+ }
+ }
+ }
+
+ arrayEach(dependencies, function (dependencyName) {
+ addListener(dependencyName, function () {
+ remainingDependencies--;
+ if (remainingDependencies === 0) {
+ enqueueTask(key, task);
+ }
+ });
+ });
+ });
+
+ processQueue();
+
+
+ function enqueueTask(key, task) {
+ readyTasks.push(function () {
+ runTask(key, task);
+ });
}
- function removeListener(fn) {
- var idx = indexOf(listeners, fn);
- if (idx >= 0) listeners.splice(idx, 1);
+ function processQueue() {
+ if (readyTasks.length === 0 && runningTasks === 0) {
+ return callback(null, results);
+ }
+ while(readyTasks.length && runningTasks < concurrency) {
+ var run = readyTasks.shift();
+ run();
+ }
+
}
- function taskComplete() {
- remainingTasks--;
- arrayEach(listeners.slice(), function (fn) {
+ function addListener(taskName, fn) {
+ var taskListeners = listeners[taskName];
+ if (!taskListeners) {
+ taskListeners = listeners[taskName] = [];
+ }
+
+ taskListeners.push(fn);
+ }
+
+ function taskComplete(taskName) {
+ var taskListeners = listeners[taskName] || [];
+ arrayEach(taskListeners, function (fn) {
fn();
});
+ processQueue();
}
- addListener(function () {
- if (!remainingTasks) {
- callback(null, results);
- }
- });
- arrayEach(keys, function (k) {
+ function runTask(key, task) {
if (hasError) return;
- var task = isArray(tasks[k]) ? tasks[k]: [tasks[k]];
+
var taskCallback = onlyOnce(rest(function(err, args) {
runningTasks--;
if (args.length <= 1) {
@@ -71,66 +125,25 @@ export default function (tasks, concurrency, callback) {
forOwn(results, function(val, rkey) {
safeResults[rkey] = val;
});
- safeResults[k] = args;
+ safeResults[key] = args;
hasError = true;
listeners = [];
callback(err, safeResults);
- }
- else {
- results[k] = args;
- setImmediate(taskComplete);
+ } else {
+ results[key] = args;
+ taskComplete(key);
}
}));
- var requires = task.slice(0, task.length - 1);
-
- checkForDeadlocks();
-
- if (ready()) {
- startNext();
+ runningTasks++;
+ var taskFn = task[task.length - 1];
+ if (task.length > 1) {
+ taskFn(results, taskCallback);
} else {
- addListener(listener);
- }
-
- function checkForDeadlocks() {
- var len = requires.length;
- var dep;
- while (len--) {
- if (!(dep = tasks[requires[len]])) {
- throw new Error('Has non-existent dependency in ' +
- requires.join(', '));
- }
- if (isArray(dep) && indexOf(dep, k) >= 0) {
- throw new Error('Has cyclic dependencies');
- }
- }
- }
-
- function ready() {
- return runningTasks < concurrency &&
- !baseHas(results, k) &&
- !hasError &&
- arrayEvery(requires, function (x) {
- return baseHas(results, x);
- });
+ taskFn(taskCallback);
}
+ }
- function startNext() {
- runningTasks++;
- var taskFn = task[task.length - 1];
- if (requires.length > 0) {
- taskFn(results, taskCallback);
- } else {
- taskFn(taskCallback);
- }
- }
- function listener() {
- if (ready()) {
- removeListener(listener);
- startNext();
- }
- }
- });
}
diff --git a/lib/autoInject.js b/lib/autoInject.js
new file mode 100644
index 0000000..bb1bda1
--- /dev/null
+++ b/lib/autoInject.js
@@ -0,0 +1,46 @@
+import auto from './auto';
+import forOwn from 'lodash/forOwn';
+import arrayMap from 'lodash/_arrayMap';
+import clone from 'lodash/_baseClone';
+import isArray from 'lodash/isArray';
+
+var argsRegex = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
+
+function parseParams(func) {
+ return func.toString().match(argsRegex)[1].split(/\s*\,\s*/);
+}
+
+export default function autoInject(tasks, callback) {
+ var newTasks = {};
+
+ forOwn(tasks, function (taskFn, key) {
+ var params;
+
+ if (isArray(taskFn)) {
+ params = clone(taskFn);
+ taskFn = params.pop();
+
+ newTasks[key] = params.concat(newTask);
+ } else if (taskFn.length === 0) {
+ throw new Error("autoInject task functions require explicit parameters.");
+ } else if (taskFn.length === 1) {
+ // no dependencies, use the function as-is
+ newTasks[key] = taskFn;
+ } else {
+ params = parseParams(taskFn);
+ params.pop();
+
+ newTasks[key] = params.concat(newTask);
+ }
+
+ function newTask(results, taskCb) {
+ var newArgs = arrayMap(params, function (name) {
+ return results[name];
+ });
+ newArgs.push(taskCb);
+ taskFn.apply(null, newArgs);
+ }
+ });
+
+ auto(newTasks, callback);
+}
diff --git a/lib/everySeries.js b/lib/everySeries.js
new file mode 100644
index 0000000..0b3db2c
--- /dev/null
+++ b/lib/everySeries.js
@@ -0,0 +1,6 @@
+'use strict';
+
+import everyLimit from './everyLimit';
+import doLimit from './internal/doLimit';
+
+export default doLimit(everyLimit, 1);
diff --git a/lib/index.js b/lib/index.js
index 869ba6e..e3eb48d 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -5,6 +5,7 @@ import applyEachSeries from './applyEachSeries';
import apply from './apply';
import asyncify from './asyncify';
import auto from './auto';
+import autoInject from './autoInject';
import cargo from './cargo';
import compose from './compose';
import concat from './concat';
@@ -27,6 +28,7 @@ import eachSeries from './eachSeries';
import ensureAsync from './ensureAsync';
import every from './every';
import everyLimit from './everyLimit';
+import everySeries from './everySeries';
import filter from './filter';
import filterLimit from './filterLimit';
import filterSeries from './filterSeries';
@@ -55,6 +57,7 @@ import series from './series';
import setImmediate from './setImmediate';
import some from './some';
import someLimit from './someLimit';
+import someSeries from './someSeries';
import sortBy from './sortBy';
import timeout from './timeout';
import times from './times';
@@ -72,6 +75,7 @@ export default {
apply: apply,
asyncify: asyncify,
auto: auto,
+ autoInject: autoInject,
cargo: cargo,
compose: compose,
concat: concat,
@@ -94,6 +98,7 @@ export default {
ensureAsync: ensureAsync,
every: every,
everyLimit: everyLimit,
+ everySeries: everySeries,
filter: filter,
filterLimit: filterLimit,
filterSeries: filterSeries,
@@ -122,6 +127,7 @@ export default {
setImmediate: setImmediate,
some: some,
someLimit: someLimit,
+ someSeries: someSeries,
sortBy: sortBy,
timeout: timeout,
times: times,
@@ -157,6 +163,7 @@ export {
apply as apply,
asyncify as asyncify,
auto as auto,
+ autoInject as autoInject,
cargo as cargo,
compose as compose,
concat as concat,
@@ -179,6 +186,7 @@ export {
ensureAsync as ensureAsync,
every as every,
everyLimit as everyLimit,
+ everySeries as everySeries,
filter as filter,
filterLimit as filterLimit,
filterSeries as filterSeries,
@@ -207,6 +215,7 @@ export {
setImmediate as setImmediate,
some as some,
someLimit as someLimit,
+ someSeries as someSeries,
sortBy as sortBy,
timeout as timeout,
times as times,
@@ -220,7 +229,14 @@ export {
// Aliases
every as all,
+ everyLimit as allLimit,
+ everySeries as allSeries,
some as any,
+ someLimit as anyLimit,
+ someSeries as anySeries,
+ detect as find,
+ detectLimit as findLimit,
+ detectSeries as findSeries,
each as forEach,
eachSeries as forEachSeries,
eachLimit as forEachLimit,
diff --git a/lib/internal/setImmediate.js b/lib/internal/setImmediate.js
index c02ad71..7d15249 100644
--- a/lib/internal/setImmediate.js
+++ b/lib/internal/setImmediate.js
@@ -1,19 +1,21 @@
'use strict';
+import rest from 'lodash/rest';
var _setImmediate = typeof setImmediate === 'function' && setImmediate;
-var _delay;
+var _defer;
if (_setImmediate) {
- _delay = function(fn) {
- // not a direct alias for IE10 compatibility
- _setImmediate(fn);
- };
+ _defer = _setImmediate;
} else if (typeof process === 'object' && typeof process.nextTick === 'function') {
- _delay = process.nextTick;
+ _defer = process.nextTick;
} else {
- _delay = function(fn) {
+ _defer = function(fn) {
setTimeout(fn, 0);
};
}
-export default _delay;
+export default rest(function (fn, args) {
+ _defer(function () {
+ fn.apply(null, args);
+ });
+});
diff --git a/lib/nextTick.js b/lib/nextTick.js
index b61a8b4..05d9555 100644
--- a/lib/nextTick.js
+++ b/lib/nextTick.js
@@ -2,6 +2,4 @@
import setImmediate from './internal/setImmediate';
-var nexTick = typeof process === 'object' && typeof process.nextTick === 'function' ? process.nextTick : setImmediate;
-
-export default nexTick;
+export default setImmediate;
diff --git a/lib/race.js b/lib/race.js
index 4a5f8a5..0ef6914 100644
--- a/lib/race.js
+++ b/lib/race.js
@@ -1,6 +1,7 @@
'use strict';
import isArray from 'lodash/isArray';
+import each from 'lodash/each';
import noop from 'lodash/noop';
import once from 'lodash/once';
@@ -8,7 +9,7 @@ export default function race(tasks, cb) {
cb = once(cb || noop);
if (!isArray(tasks)) return cb(new TypeError('First argument to race must be an array of functions'));
if (!tasks.length) return cb();
- for (let i = 0; i < tasks.length; i++) {
- tasks[i](cb);
- }
+ each(tasks, function (task) {
+ task(cb);
+ });
}
diff --git a/lib/someSeries.js b/lib/someSeries.js
new file mode 100644
index 0000000..a5fc97c
--- /dev/null
+++ b/lib/someSeries.js
@@ -0,0 +1,6 @@
+'use strict';
+
+import someLimit from './someLimit';
+import doLimit from './internal/doLimit';
+
+export default doLimit(someLimit, 1);
diff --git a/lib/waterfall.js b/lib/waterfall.js
index 8867c87..9882e11 100644
--- a/lib/waterfall.js
+++ b/lib/waterfall.js
@@ -5,28 +5,31 @@ import noop from 'lodash/noop';
import once from 'lodash/once';
import rest from 'lodash/rest';
-import ensureAsync from './ensureAsync';
-import iterator from './iterator';
+import onlyOnce from './internal/onlyOnce';
export default function(tasks, cb) {
cb = once(cb || noop);
if (!isArray(tasks)) return cb(new Error('First argument to waterfall must be an array of functions'));
if (!tasks.length) return cb();
+ var taskIndex = 0;
- function wrapIterator(iterator) {
- return rest(function(err, args) {
+ function nextTask(args) {
+ if (taskIndex === tasks.length) {
+ return cb.apply(null, [null].concat(args));
+ }
+
+ var taskCallback = onlyOnce(rest(function(err, args) {
if (err) {
- cb.apply(null, [err].concat(args));
- } else {
- var next = iterator.next();
- if (next) {
- args.push(wrapIterator(next));
- } else {
- args.push(cb);
- }
- ensureAsync(iterator).apply(null, args);
+ return cb.apply(null, [err].concat(args));
}
- });
+ nextTask(args);
+ }));
+
+ args.push(taskCallback);
+
+ var task = tasks[taskIndex++];
+ task.apply(null, args);
}
- wrapIterator(iterator(tasks))();
+
+ nextTask([]);
}
diff --git a/mocha_test/auto.js b/mocha_test/auto.js
index 6b96be4..1850a0c 100644
--- a/mocha_test/auto.js
+++ b/mocha_test/auto.js
@@ -40,7 +40,7 @@ describe('auto', function () {
},
function(err){
expect(err).to.equal(null);
- expect(callOrder).to.eql(['task2','task6','task3','task5','task1','task4']);
+ expect(callOrder).to.eql(['task2','task3','task6','task5','task1','task4']);
done();
});
});
@@ -214,19 +214,8 @@ describe('auto', function () {
// Issue 410 on github: https://github.com/caolan/async/issues/410
it('auto calls callback multiple times', function(done) {
- if (process.browser) {
- // node only test
- return done();
- }
var finalCallCount = 0;
- var domain = require('domain').create();
- domain.on('error', function (e) {
- // ignore test error
- if (!e._test_error) {
- return done(e);
- }
- });
- domain.run(function () {
+ try {
async.auto({
task1: function(callback) { callback(null); },
task2: ['task1', function(results, callback) { callback(null); }]
@@ -239,7 +228,11 @@ describe('auto', function () {
e._test_error = true;
throw e;
});
- });
+ } catch (e) {
+ if (!e._test_error) {
+ throw e;
+ }
+ }
setTimeout(function () {
expect(finalCallCount).to.equal(1);
done();
@@ -293,7 +286,7 @@ describe('auto', function () {
callback(null, 'task1');
}]
});
- }).to.throw;
+ }).to.throw();
done();
});
@@ -308,7 +301,7 @@ describe('auto', function () {
callback(null, 'task2');
}]
});
- }).to.throw;
+ }).to.throw();
done();
});
@@ -356,4 +349,20 @@ describe('auto', function () {
}).to.throw();
});
+ it("should avoid unncecessary deferrals", function (done) {
+ var isSync = true;
+
+ async.auto({
+ step1: function (cb) { cb(null, 1); },
+ step2: ["step1", function (results, cb) {
+ cb();
+ }]
+ }, function () {
+ expect(isSync).to.equal(true);
+ done();
+ });
+
+ isSync = false;
+ });
+
});
diff --git a/mocha_test/autoInject.js b/mocha_test/autoInject.js
new file mode 100644
index 0000000..059c7ae
--- /dev/null
+++ b/mocha_test/autoInject.js
@@ -0,0 +1,77 @@
+var async = require('../lib');
+var expect = require('chai').expect;
+var _ = require('lodash');
+
+describe('autoInject', function () {
+
+ it("basics", function (done) {
+ var callOrder = [];
+ async.autoInject({
+ task1: function(task2, callback){
+ expect(task2).to.equal(2);
+ setTimeout(function(){
+ callOrder.push('task1');
+ callback(null, 1);
+ }, 25);
+ },
+ task2: function(callback){
+ setTimeout(function(){
+ callOrder.push('task2');
+ callback(null, 2);
+ }, 50);
+ },
+ task3: function(task2, callback){
+ expect(task2).to.equal(2);
+ callOrder.push('task3');
+ callback(null, 3);
+ },
+ task4: function(task1, task2, callback){
+ expect(task1).to.equal(1);
+ expect(task2).to.equal(2);
+ callOrder.push('task4');
+ callback(null, 4);
+ },
+ task5: function(task2, callback){
+ expect(task2).to.equal(2);
+ setTimeout(function(){
+ callOrder.push('task5');
+ callback(null, 5);
+ }, 0);
+ },
+ task6: function(task2, callback){
+ expect(task2).to.equal(2);
+ callOrder.push('task6');
+ callback(null, 6);
+ }
+ },
+ function(err, results){
+ expect(results.task6).to.equal(6);
+ expect(callOrder).to.eql(['task2','task3','task6','task5','task1','task4']);
+ done();
+ });
+ });
+
+ it('should work with array tasks', function (done) {
+ var callOrder = [];
+
+ async.autoInject({
+ task1: function (cb) {
+ callOrder.push('task1');
+ cb(null, 1);
+ },
+ task2: ['task3', function (task3, cb) {
+ expect(task3).to.equal(3);
+ callOrder.push('task2');
+ cb(null, 2);
+ }],
+ task3: function (cb) {
+ callOrder.push('task3');
+ cb(null, 3);
+ }
+ }, function () {
+ expect(callOrder).to.eql(['task1','task3','task2']);
+ done();
+ });
+ });
+
+});
diff --git a/mocha_test/detect.js b/mocha_test/detect.js
index e1eec79..97d7c3d 100644
--- a/mocha_test/detect.js
+++ b/mocha_test/detect.js
@@ -120,4 +120,18 @@ describe("detect", function () {
});
});
+
+ it('find alias', function(){
+ expect(async.find).to.equal(async.detect);
+ });
+
+ it('findLimit alias', function(){
+ expect(async.findLimit).to.equal(async.detectLimit);
+ });
+
+ it('findSeries alias', function(){
+ expect(async.findSeries).to.be.a('function');
+ expect(async.findSeries).to.equal(async.detectSeries);
+ });
+
});
diff --git a/mocha_test/every.js b/mocha_test/every.js
index 2f562ce..b8cfb7a 100644
--- a/mocha_test/every.js
+++ b/mocha_test/every.js
@@ -87,4 +87,13 @@ describe("every", function () {
expect(async.all).to.equal(async.every);
});
+ it('allLimit alias', function(){
+ expect(async.allLimit).to.equal(async.everyLimit);
+ });
+
+ it('allSeries alias', function(){
+ expect(async.allSeries).to.be.a('function');
+ expect(async.allSeries).to.equal(async.everySeries);
+ });
+
});
diff --git a/mocha_test/nextTick.js b/mocha_test/nextTick.js
new file mode 100644
index 0000000..b428822
--- /dev/null
+++ b/mocha_test/nextTick.js
@@ -0,0 +1,38 @@
+var async = require('../lib');
+var expect = require('chai').expect;
+
+describe("nextTick", function () {
+
+ it('basics', function(done){
+ var call_order = [];
+ async.nextTick(function(){call_order.push('two');});
+ call_order.push('one');
+ setTimeout(function(){
+ expect(call_order).to.eql(['one','two']);
+ done();
+ }, 50);
+ });
+
+ it('nextTick in the browser', function(done){
+ if (!process.browser) {
+ // skip this test in node
+ return done();
+ }
+
+ var call_order = [];
+ async.nextTick(function(){call_order.push('two');});
+
+ call_order.push('one');
+ setTimeout(function(){
+ expect(call_order).to.eql(['one','two']);
+ done();
+ }, 50);
+ });
+
+ it("extra args", function (done) {
+ async.nextTick(function (a, b, c) {
+ expect([a, b, c]).to.eql([1, 2, 3]);
+ done();
+ }, 1, 2, 3);
+ });
+});
diff --git a/mocha_test/setImmediate.js b/mocha_test/setImmediate.js
new file mode 100644
index 0000000..854111a
--- /dev/null
+++ b/mocha_test/setImmediate.js
@@ -0,0 +1,24 @@
+var async = require('../lib');
+var expect = require('chai').expect;
+
+describe("setImmediate", function () {
+
+ it('basics', function(done){
+ var call_order = [];
+ async.setImmediate(function(){call_order.push('two');});
+ call_order.push('one');
+
+ setTimeout(function(){
+ expect(call_order).to.eql(['one','two']);
+ done();
+ }, 25);
+ });
+
+ it("extra args", function (done) {
+ async.setImmediate(function (a, b, c) {
+ expect([a, b, c]).to.eql([1, 2, 3]);
+ done();
+ }, 1, 2, 3);
+ });
+
+});
diff --git a/mocha_test/some.js b/mocha_test/some.js
index 8bdcb6b..a4b57a5 100644
--- a/mocha_test/some.js
+++ b/mocha_test/some.js
@@ -87,5 +87,14 @@ describe("some", function () {
expect(async.any).to.equal(async.some);
});
+ it('anyLimit alias', function(){
+ expect(async.anyLimit).to.equal(async.someLimit);
+ });
+
+ it('anySeries alias', function(){
+ expect(async.anySeries).to.be.a('function');
+ expect(async.anySeries).to.equal(async.someSeries);
+ });
+
});
diff --git a/mocha_test/waterfall.js b/mocha_test/waterfall.js
new file mode 100644
index 0000000..b1d1561
--- /dev/null
+++ b/mocha_test/waterfall.js
@@ -0,0 +1,148 @@
+var async = require('../lib');
+var expect = require('chai').expect;
+
+describe("waterfall", function () {
+
+ it('basics', function(done){
+ var call_order = [];
+ async.waterfall([
+ function(callback){
+ call_order.push('fn1');
+ setTimeout(function(){callback(null, 'one', 'two');}, 0);
+ },
+ function(arg1, arg2, callback){
+ call_order.push('fn2');
+ expect(arg1).to.equal('one');
+ expect(arg2).to.equal('two');
+ setTimeout(function(){callback(null, arg1, arg2, 'three');}, 25);
+ },
+ function(arg1, arg2, arg3, callback){
+ call_order.push('fn3');
+ expect(arg1).to.equal('one');
+ expect(arg2).to.equal('two');
+ expect(arg3).to.equal('three');
+ callback(null, 'four');
+ },
+ function(arg4, callback){
+ call_order.push('fn4');
+ expect(call_order).to.eql(['fn1','fn2','fn3','fn4']);
+ callback(null, 'test');
+ }
+ ], function(err){
+ expect(err === null, err + " passed instead of 'null'");
+ done();
+ });
+ });
+
+ it('empty array', function(done){
+ async.waterfall([], function(err){
+ if (err) throw err;
+ done();
+ });
+ });
+
+ it('non-array', function(done){
+ async.waterfall({}, function(err){
+ expect(err.message).to.equal('First argument to waterfall must be an array of functions');
+ done();
+ });
+ });
+
+ it('no callback', function(done){
+ async.waterfall([
+ function(callback){callback();},
+ function(callback){callback(); done();}
+ ]);
+ });
+
+ it('async', function(done){
+ var call_order = [];
+ async.waterfall([
+ function(callback){
+ call_order.push(1);
+ callback();
+ call_order.push(2);
+ },
+ function(callback){
+ call_order.push(3);
+ callback();
+ },
+ function(){
+ expect(call_order).to.eql([1,3]);
+ done();
+ }
+ ]);
+ });
+
+ it('error', function(done){
+ async.waterfall([
+ function(callback){
+ callback('error');
+ },
+ function(callback){
+ test.ok(false, 'next function should not be called');
+ callback();
+ }
+ ], function(err){
+ expect(err).to.equal('error');
+ done();
+ });
+ });
+
+ it('multiple callback calls', function(){
+ var arr = [
+ function(callback){
+ // call the callback twice. this should call function 2 twice
+ callback(null, 'one', 'two');
+ callback(null, 'one', 'two');
+ },
+ function(arg1, arg2, callback){
+ callback(null, arg1, arg2, 'three');
+ }
+ ];
+ expect(function () {
+ async.waterfall(arr, function () {});
+ }).to.throw(/already called/);
+ });
+
+ it('call in another context', function(done) {
+ if (process.browser) {
+ // node only test
+ done();
+ return;
+ }
+
+ var vm = require('vm');
+ var sandbox = {
+ async: async,
+ done: done
+ };
+
+ var fn = "(" + (function () {
+ async.waterfall([function (callback) {
+ callback();
+ }], function (err) {
+ if (err) {
+ return done(err);
+ }
+ done();
+ });
+ }).toString() + "())";
+
+ vm.runInNewContext(fn, sandbox);
+ });
+
+ it('should not use unnecessary deferrals', function (done) {
+ var sameStack = true;
+
+ async.waterfall([
+ function (cb) { cb(null, 1); },
+ function (arg, cb) { cb(); }
+ ], function() {
+ expect(sameStack).to.equal(true);
+ done();
+ });
+
+ sameStack = false;
+ });
+});
diff --git a/support/xyz.sh b/support/xyz.sh
index 8fd8d2d..e178eee 100755
--- a/support/xyz.sh
+++ b/support/xyz.sh
@@ -84,7 +84,7 @@ while (($# > 0)) ; do
exit
;;
-v|--version)
- node -p "require('$dir/package.json').version"
+ node -p "require('$dir/../package.json').version"
exit
;;
-b|--branch) branch="$1" ; shift ;;
@@ -117,7 +117,7 @@ name=$(node -p "require('./package.json').name" 2>/dev/null) ||
version=$(node -p "require('./package.json').version" 2>/dev/null) ||
(echo "Cannot read package version" >&2 ; exit 1)
-next_version=$("$dir/node_modules/.bin/semver" -i "$increment" "$version") ||
+next_version=$("$dir/../node_modules/.bin/semver" -i "$increment" "$version") ||
(echo "Cannot increment version number" >&2 ; exit 1)
message="${message_template//X.Y.Z/$next_version}"
@@ -160,7 +160,7 @@ inc() {
inc package.json
-run "./sync-package-managers.js"
+run "$dir/sync-package-managers.js"
run "git add --force *.json"
run "git commit --message '$message'"
diff --git a/test/test-async.js b/test/test-async.js
index 1e5dcb1..171810c 100755
--- a/test/test-async.js
+++ b/test/test-async.js
@@ -1,6 +1,6 @@
/**
* NOTE: We are in the process of migrating these tests to Mocha. If you are
- * adding a new test, consider creating a new spec file in mocha_tests/
+ * adding a new test, please create a new spec file in mocha_tests/
*/
require('babel-core/register');
@@ -279,154 +279,6 @@ exports['seq without callback'] = function (test) {
};
-exports['waterfall'] = {
-
- 'basic': function(test){
- test.expect(7);
- var call_order = [];
- async.waterfall([
- function(callback){
- call_order.push('fn1');
- setTimeout(function(){callback(null, 'one', 'two');}, 0);
- },
- function(arg1, arg2, callback){
- call_order.push('fn2');
- test.equals(arg1, 'one');
- test.equals(arg2, 'two');
- setTimeout(function(){callback(null, arg1, arg2, 'three');}, 25);
- },
- function(arg1, arg2, arg3, callback){
- call_order.push('fn3');
- test.equals(arg1, 'one');
- test.equals(arg2, 'two');
- test.equals(arg3, 'three');
- callback(null, 'four');
- },
- function(arg4, callback){
- call_order.push('fn4');
- test.same(call_order, ['fn1','fn2','fn3','fn4']);
- callback(null, 'test');
- }
- ], function(err){
- test.ok(err === null, err + " passed instead of 'null'");
- test.done();
- });
-},
-
- 'empty array': function(test){
- async.waterfall([], function(err){
- if (err) throw err;
- test.done();
- });
-},
-
- 'non-array': function(test){
- async.waterfall({}, function(err){
- test.equals(err.message, 'First argument to waterfall must be an array of functions');
- test.done();
- });
-},
-
- 'no callback': function(test){
- async.waterfall([
- function(callback){callback();},
- function(callback){callback(); test.done();}
- ]);
-},
-
- 'async': function(test){
- var call_order = [];
- async.waterfall([
- function(callback){
- call_order.push(1);
- callback();
- call_order.push(2);
- },
- function(callback){
- call_order.push(3);
- callback();
- },
- function(){
- test.same(call_order, [1,2,3]);
- test.done();
- }
- ]);
-},
-
- 'error': function(test){
- test.expect(1);
- async.waterfall([
- function(callback){
- callback('error');
- },
- function(callback){
- test.ok(false, 'next function should not be called');
- callback();
- }
- ], function(err){
- test.equals(err, 'error');
- });
- setTimeout(test.done, 50);
-},
-
- 'multiple callback calls': function(test){
- var call_order = [];
- var arr = [
- function(callback){
- call_order.push(1);
- // call the callback twice. this should call function 2 twice
- callback(null, 'one', 'two');
- callback(null, 'one', 'two');
- },
- function(arg1, arg2, callback){
- call_order.push(2);
- callback(null, arg1, arg2, 'three');
- },
- function(arg1, arg2, arg3, callback){
- call_order.push(3);
- callback(null, 'four');
- },
- function(/*arg4*/){
- call_order.push(4);
- arr[3] = function(){
- call_order.push(4);
- test.same(call_order, [1,2,2,3,3,4,4]);
- test.done();
- };
- }
- ];
- async.waterfall(arr);
-},
-
- 'call in another context': function(test) {
- if (isBrowser()) {
- // node only test
- test.done();
- return;
- }
-
- var vm = require('vm');
- var sandbox = {
- async: async,
- test: test
- };
-
- var fn = "(" + (function () {
- async.waterfall([function (callback) {
- callback();
- }], function (err) {
- if (err) {
- return test.done(err);
- }
- test.done();
- });
- }).toString() + "())";
-
- vm.runInNewContext(fn, sandbox);
-}
-
-};
-
exports['parallel'] = function(test){
var call_order = [];
async.parallel([
@@ -1929,33 +1781,6 @@ console_fn_tests('dir');
console_fn_tests('warn');
console_fn_tests('error');*/
-exports['nextTick'] = function(test){
- test.expect(1);
- var call_order = [];
- async.nextTick(function(){call_order.push('two');});
- call_order.push('one');
- setTimeout(function(){
- test.same(call_order, ['one','two']);
- test.done();
- }, 50);
-};
-
-exports['nextTick in the browser'] = function(test){
- if (!isBrowser()) {
- // skip this test in node
- return test.done();
- }
- test.expect(1);
-
- var call_order = [];
- async.nextTick(function(){call_order.push('two');});
-
- call_order.push('one');
- setTimeout(function(){
- test.same(call_order, ['one','two']);
- }, 50);
- setTimeout(test.done, 100);
-};
exports['concat'] = function(test){
test.expect(3);