UNPKG

@codibre/fluent-iterable

Version:

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

39 lines (38 loc) 1.38 kB
"use strict"; 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); }; }