@codibre/fluent-iterable
Version:
Provides LINQ-like fluent api operations for iterables and async iterables (ES2018+).
39 lines (38 loc) • 1.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.distinctByRecipe = distinctByRecipe;
const prepare_1 = require("../types-internal/prepare");
function chooseDistinctByRecipe({ forEach, resolver }) {
return function distinct(mappers) {
const { length } = mappers;
const setPos = length - 1;
const lastMap = setPos - 1;
const map = setPos === 0 ? new Set() : new Map();
const result = [];
return resolver(forEach.call(this, (x) => {
let current = map;
for (let i = 0; i < setPos; i++) {
const mapper = mappers[i];
const k = mapper(x);
const prev = current;
current = prev.get(k);
if (!current) {
current = i === lastMap ? new Set() : new Map();
prev.set(k, current);
}
}
const k = mappers[setPos](x);
if (!current.has(k)) {
current.add(k);
result.push(x);
}
}), () => result);
};
}
function distinctByRecipe(ingredients) {
const choose = chooseDistinctByRecipe(ingredients);
return function distinctBy(...baseMappers) {
const mappers = baseMappers.map(prepare_1.prepare);
return choose.call(this, mappers);
};
}