UNPKG

@codibre/fluent-iterable

Version:

Provides LINQ-like fluent api operations for iterables and async iterables (ES2018+).

50 lines (49 loc) 1.76 kB
"use strict"; 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; } }; }