@codibre/fluent-iterable
Version:
Provides LINQ-like fluent api operations for iterables and async iterables (ES2018+).
27 lines (26 loc) • 1.34 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.filterRecipe = filterRecipe;
const types_internal_1 = require("../types-internal");
const prepare_1 = require("../types-internal/prepare");
const utils_1 = require("../utils");
const augment_iterable_recipe_1 = require("./augment-iterable-recipe");
function filterRecipe(filterIterable, takeWhileIterable, resolver) {
const baseFilter = (0, augment_iterable_recipe_1.augmentIterableRecipe)(filterIterable);
const takeWhile = (0, augment_iterable_recipe_1.augmentIterableRecipe)(takeWhileIterable);
return function (basePredicate = utils_1.identity) {
const predicate = (0, prepare_1.prepare)(basePredicate);
if ((0, types_internal_1.isAnyOrderAssured)(predicate, this)) {
let alreadyTrue = false;
let lastResult = false;
const takeWhilePredicate = (t) => resolver(predicate(t), (result) => {
alreadyTrue = alreadyTrue || result;
lastResult = result;
return !alreadyTrue || lastResult;
});
const action = () => lastResult;
return (0, types_internal_1.keepOrderAssuring)(baseFilter.call(takeWhile.call(this, takeWhilePredicate), action), this);
}
return baseFilter.call(this, predicate);
};
}