// Copyright 2018-2026 the Deno authors. MIT license. // This module is browser compatible. /** * Applies the given selector to all elements of the provided collection and * returns the max value of all elements. If an empty array is provided the * function will return undefined. * * @typeParam T The type of the elements in the array. * * @param array The array to find the maximum element in. * @param selector The function to get the value to compare from each element. * * @returns The largest value of the given function or undefined if there are no * elements. * * @example Basic usage * ```ts * import { maxOf } from "max_of.ts"; * import { assertEquals } from "../assert/mod.ts"; * * const inventory = [ * { name: "mustard", count: 2 }, * { name: "soy", count: 4 }, * { name: "tomato", count: 32 }, * ]; * * const maxCount = maxOf(inventory, (item) => item.count); * * assertEquals(maxCount, 32); * ``` */ export function maxOf( array: Iterable, selector: (el: T) => number, ): number | undefined; /** * Applies the given selector to all elements of the provided collection and * returns the max value of all elements. If an empty array is provided the * function will return undefined. * * @typeParam T The type of the elements in the array. * * @param array The array to find the maximum element in. * @param selector The function to get the value to compare from each element. * * @returns The first element that is the largest value of the given function or * undefined if there are no elements. * * @example Basic usage * ```ts * import { maxOf } from "max_of.ts"; * import { assertEquals } from "../assert/mod.ts"; * * const inventory = [ * { name: "mustard", count: 2n }, * { name: "soy", count: 4n }, * { name: "tomato", count: 32n }, * ]; * * const maxCount = maxOf(inventory, (i) => i.count); * * assertEquals(maxCount, 32n); * ``` */ export function maxOf( array: Iterable, selector: (el: T) => bigint, ): bigint | undefined; export function maxOf number) | ((el: T) => bigint)>( array: Iterable, selector: S, ): ReturnType | undefined { if (Array.isArray(array)) { const length = array.length; if (length === 0) return undefined; let max = selector(array[0]!) as ReturnType; if (Number.isNaN(max)) return max; for (let i = 1; i < length; i++) { const currentValue = selector(array[i]!) as ReturnType; if (currentValue > max) { max = currentValue; } else if (Number.isNaN(currentValue)) { return currentValue; } } return max; } const iter = array[Symbol.iterator](); const first = iter.next(); if (first.done) return undefined; let max = selector(first.value) as ReturnType; if (Number.isNaN(max)) return max; let next = iter.next(); while (!next.done) { const currentValue = selector(next.value) as ReturnType; if (currentValue > max) { max = currentValue; } else if (Number.isNaN(currentValue)) { return currentValue; } next = iter.next(); } return max; }