66 lines
1.7 KiB
JavaScript
66 lines
1.7 KiB
JavaScript
|
|
throw new Error("TODO: Not yet implemented.")
|
|
|
|
/*
|
|
usage:
|
|
|
|
Like asyncMap, but only can take a single cb, and guarantees
|
|
the order of the results.
|
|
*/
|
|
|
|
module.exports = asyncMapOrdered
|
|
|
|
function asyncMapOrdered (list, fn, cb_) {
|
|
if (typeof cb_ !== "function") throw new Error(
|
|
"No callback provided to asyncMapOrdered")
|
|
|
|
if (typeof fn !== "function") throw new Error(
|
|
"No map function provided to asyncMapOrdered")
|
|
|
|
if (list === undefined || list === null) return cb_(null, [])
|
|
if (!Array.isArray(list)) list = [list]
|
|
if (!list.length) return cb_(null, [])
|
|
|
|
var errState = null
|
|
, l = list.length
|
|
, a = l
|
|
, res = []
|
|
, resCount = 0
|
|
, maxArgLen = 0
|
|
|
|
function cb (index) { return function () {
|
|
if (errState) return
|
|
var er = arguments[0]
|
|
var argLen = arguments.length
|
|
maxArgLen = Math.max(maxArgLen, argLen)
|
|
res[index] = argLen === 1 ? [er] : Array.apply(null, arguments)
|
|
|
|
// see if any new things have been added.
|
|
if (list.length > l) {
|
|
var newList = list.slice(l)
|
|
a += (list.length - l)
|
|
var oldLen = l
|
|
l = list.length
|
|
process.nextTick(function () {
|
|
newList.forEach(function (ar, i) { fn(ar, cb(i + oldLen)) })
|
|
})
|
|
}
|
|
|
|
if (er || --a === 0) {
|
|
errState = er
|
|
cb_.apply(null, [errState].concat(flip(res, resCount, maxArgLen)))
|
|
}
|
|
}}
|
|
// expect the supplied cb function to be called
|
|
// "n" times for each thing in the array.
|
|
list.forEach(function (ar) {
|
|
steps.forEach(function (fn, i) { fn(ar, cb(i)) })
|
|
})
|
|
}
|
|
|
|
function flip (res, resCount, argLen) {
|
|
var flat = []
|
|
// res = [[er, x, y], [er, x1, y1], [er, x2, y2, z2]]
|
|
// return [[x, x1, x2], [y, y1, y2], [undefined, undefined, z2]]
|
|
|