UNPKG

ts-data-forge

Version:

[![npm version](https://img.shields.io/npm/v/ts-data-forge.svg)](https://www.npmjs.com/package/ts-data-forge) [![npm downloads](https://img.shields.io/npm/dm/ts-data-forge.svg)](https://www.npmjs.com/package/ts-data-forge) [![License](https://img.shields.

164 lines (161 loc) 6.25 kB
import { isError } from '@sindresorhus/is'; import '../../collections/imap-mapped.mjs'; import { IMap } from '../../collections/imap.mjs'; import '../../collections/iset-mapped.mjs'; import '../../collections/iset.mjs'; import { isString, isUndefined } from '../../guard/is-type.mjs'; import { none } from '../../functional/optional/impl/optional-none.mjs'; import { some } from '../../functional/optional/impl/optional-some.mjs'; import { err } from '../../functional/result/impl/result-err.mjs'; import { ok } from '../../functional/result/impl/result-ok.mjs'; import { unknownToString } from '../../others/unknown-to-string.mjs'; import '../../number/branded-types/finite-number.mjs'; import '../../number/branded-types/int.mjs'; import '../../number/branded-types/int16.mjs'; import '../../number/branded-types/int32.mjs'; import '../../number/branded-types/non-negative-finite-number.mjs'; import '../../number/branded-types/non-negative-int16.mjs'; import '../../number/branded-types/non-negative-int32.mjs'; import '../../number/branded-types/non-zero-finite-number.mjs'; import '../../number/branded-types/non-zero-int.mjs'; import '../../number/branded-types/non-zero-int16.mjs'; import '../../number/branded-types/non-zero-int32.mjs'; import '../../number/branded-types/non-zero-safe-int.mjs'; import '../../number/branded-types/non-zero-uint16.mjs'; import '../../number/branded-types/non-zero-uint32.mjs'; import '../../number/branded-types/positive-finite-number.mjs'; import '../../number/branded-types/positive-int.mjs'; import '../../number/branded-types/positive-int16.mjs'; import '../../number/branded-types/positive-int32.mjs'; import '../../number/branded-types/positive-safe-int.mjs'; import '../../number/branded-types/positive-uint16.mjs'; import '../../number/branded-types/positive-uint32.mjs'; import '../../number/branded-types/safe-int.mjs'; import '../../number/branded-types/safe-uint.mjs'; import '../../number/branded-types/uint.mjs'; import '../../number/branded-types/uint16.mjs'; import { Uint32, asUint32 } from '../../number/branded-types/uint32.mjs'; import '../../number/enum/int8.mjs'; import '../../number/enum/uint8.mjs'; import { Num } from '../../number/num.mjs'; import '../../number/refined-number-utils.mjs'; import { isNonEmpty } from './array-utils-validation.mjs'; function min(array, comparator) { if (!isNonEmpty(array)) { return none; } const cmp = comparator ?? ((x, y) => Num.from(x) - Num.from(y)); return some(array.reduce((currentMin, curr) => (cmp(curr, currentMin) < 0 ? curr : currentMin), array[0])); } function max(array, comparator) { const cmp = comparator ?? ((x, y) => Num.from(x) - Num.from(y)); // Find max by finding min with an inverted comparator return min(array, (x, y) => -cmp(x, y)); } function minBy(array, comparatorValueMapper, comparator) { return min(array, (x, y) => comparator === undefined ? Num.from(comparatorValueMapper(x)) - Num.from(comparatorValueMapper(y)) : comparator(comparatorValueMapper(x), comparatorValueMapper(y))); } function maxBy(array, comparatorValueMapper, comparator) { return max(array, (x, y) => comparator === undefined ? Num.from(comparatorValueMapper(x)) - Num.from(comparatorValueMapper(y)) : comparator(comparatorValueMapper(x), comparatorValueMapper(y))); } function count(...args) { switch (args.length) { case 2: { const [array, predicate] = args; return array.reduce((acc, curr, index) => predicate(curr, asUint32(index)) ? Uint32.add(acc, 1) : acc, asUint32(0)); } case 1: { const [predicate] = args; return (array) => count(array, predicate); } } } function countBy(...args) { switch (args.length) { case 2: { const [array, grouper] = args; const mut_groups = new Map(); for (const [index, e] of array.entries()) { const key = grouper(e, asUint32(index)); const curr = mut_groups.get(key) ?? 0; mut_groups.set(key, asUint32(curr + 1)); } return IMap.create(mut_groups); } case 1: { const [grouper] = args; return (array) => countBy(array, grouper); } } } function foldl(...args) { switch (args.length) { case 3: { const [array, callbackfn, initialValue] = args; return array.reduce((prev, curr, index) => callbackfn(prev, curr, asUint32(index)), initialValue); } case 2: { const [callbackfn, initialValue] = args; return (array) => foldl(array, callbackfn, initialValue); } } } function foldr(...args) { switch (args.length) { case 3: { const [array, callbackfn, initialValue] = args; return array.reduceRight((prev, curr, index) => callbackfn(prev, curr, asUint32(index)), initialValue); } case 2: { const [callbackfn, initialValue] = args; return (array) => foldr(array, callbackfn, initialValue); } } } function sum(array) { return array.reduce((prev, curr) => prev + curr, 0); } function join(...args) { switch (args.length) { case 0: return (array) => joinImpl(array, undefined); case 1: { const [arg] = args; if (isString(arg) || isUndefined(arg)) { return (array) => joinImpl(array, arg); } return joinImpl(arg, undefined); } case 2: { const [array, separator] = args; return joinImpl(array, separator); } } } const joinImpl = (array, separator) => { try { const result = array.join(separator); return ok(result); } catch (error) { return err(isError(error) ? error : new Error(unknownToString(error))); } }; /** * Alias for `foldl`. * * @see {@link foldl} */ const reduce = foldl; /** * Alias for `foldr`. * * @see {@link foldr} */ const reduceRight = foldr; export { count, countBy, foldl, foldr, join, max, maxBy, min, minBy, reduce, reduceRight, sum }; //# sourceMappingURL=array-utils-reducing-value.mjs.map