Welcome to mirror list, hosted at ThFree Co, Russian Federation.

some.js « async-some « node_modules « npm « deps - github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 0419709f763daa3ceb603d09895c2c68384d7938 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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
}