Source: operators/takeWhile/takeWhile.js

const reusable = require("../../helpers/reusable/reusable");

/**
 *
 * @function takeWhile
 * @template T
 * @param {Predicate<T>} predicate
 * @returns {Operator<T, T>} an Operator that will emit values until a value in the source iterable does not fulfill the predicate
 */
module.exports = predicate => reusable(
    function*(source) {
        for (const value of source) {
            if (predicate(value)) {
                yield value;
            } else {
                break;
            }
        }
    }
);