马宇豪
2024-07-16 f591c27b57e2418c9495bc02ae8cfff84d35bc18
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
48
49
50
/*
    MIT License http://www.opensource.org/licenses/mit-license.php
    Author Tobias Koppers @sokra
*/
 
"use strict";
 
/** @typedef {import("./Resolver").ResolveRequest} ResolveRequest */
 
/**
 * @template T
 * @template Z
 * @callback Iterator
 * @param {T} item item
 * @param {(err?: null|Error, result?: null|Z) => void} callback callback
 * @param {number} i index
 * @returns {void}
 */
 
/**
 * @template T
 * @template Z
 * @param {T[]} array array
 * @param {Iterator<T, Z>} iterator iterator
 * @param {(err?: null|Error, result?: null|Z) => void} callback callback after all items are iterated
 * @returns {void}
 */
module.exports = function forEachBail(array, iterator, callback) {
    if (array.length === 0) return callback();
 
    let i = 0;
    const next = () => {
        /** @type {boolean|undefined} */
        let loop = undefined;
        iterator(
            array[i++],
            (err, result) => {
                if (err || result !== undefined || i >= array.length) {
                    return callback(err, result);
                }
                if (loop === false) while (next());
                loop = true;
            },
            i
        );
        if (!loop) loop = false;
        return loop;
    };
    while (next());
};