@codibre/fluent-iterable
Version:
Provides LINQ-like fluent api operations for iterables and async iterables (ES2018+).
50 lines (49 loc) • 1.76 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.getGroupingTopHit = getGroupingTopHit;
const prepare_1 = require("../types-internal/prepare");
const utils_1 = require("./utils");
const noDistinct = (0, utils_1.constant)(1);
function getGroupingTopHit(distinct, choose, mapper = utils_1.identity) {
const preparedMapper = (0, prepare_1.prepare)(mapper);
let preparedDistinct;
if (!choose) {
preparedDistinct = noDistinct;
choose = distinct;
const chosenMap = new Map();
return function (k, v, previous) {
const mapped = preparedMapper(v);
const prev = chosenMap.get(k);
if (!prev) {
chosenMap.set(k, [mapped, previous.length]);
return [mapped];
}
const chosen = choose(prev[0], mapped);
if (chosen !== prev[0]) {
chosenMap.set(k, [chosen, prev[1]]);
previous[prev[1]] = chosen;
}
};
}
preparedDistinct = (0, prepare_1.prepare)(distinct);
const groupMap = new Map();
return function (k, v, previous) {
let chosenMap = groupMap.get(k);
if (!chosenMap) {
chosenMap = new Map();
groupMap.set(k, chosenMap);
}
const mapped = preparedMapper(v);
const chosenKey = preparedDistinct(v);
const prev = chosenMap.get(chosenKey);
if (!prev) {
chosenMap.set(chosenKey, [mapped, previous.length]);
return [mapped];
}
const chosen = choose(prev[0], mapped);
if (chosen !== prev[0]) {
chosenMap.set(chosenKey, [chosen, prev[1]]);
previous[prev[1]] = chosen;
}
};
}