blob: 0419709f763daa3ceb603d09895c2c68384d7938 [file] [log] [blame]
var assert = require("assert")
var dezalgoify = require("dezalgo")
module.exports = some
/**
* short-circuited async Array.prototype.some implementation
*
* Serially evaluates a list of values from a JS array or arraylike
* against an asynchronous predicate, terminating on the first truthy
* value. If the predicate encounters an error, pass it to the completion
* callback. Otherwise, pass the truthy value passed by the predicate, or
* `false` if no truthy value was passed.
*/
function some (list, test, cb) {
assert("length" in list, "array must be arraylike")
assert.equal(typeof test, "function", "predicate must be callable")
assert.equal(typeof cb, "function", "callback must be callable")
var array = slice(list)
, index = 0
, length = array.length
, hecomes = dezalgoify(cb)
map()
function map () {
if (index >= length) return hecomes(null, false)
test(array[index], reduce)
}
function reduce (er, result) {
if (er) return hecomes(er, false)
if (result) return hecomes(null, result)
index++
map()
}
}
// Array.prototype.slice on arguments arraylike is expensive
function slice(args) {
var l = args.length, a = [], i
for (i = 0; i < l; i++) a[i] = args[i]
return a
}