--- /dev/null
+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
+}