ts-data-forge
Version:
[](https://www.npmjs.com/package/ts-data-forge) [](https://www.npmjs.com/package/ts-data-forge) [ • 6.25 kB
JavaScript
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