import { curryN } from "@unboxing/function"; import { Ord, ArrOrdFunc } from '@unboxing/core' interface MaxBy { (fn: ArrOrdFunc, arr: ArrayLike): T; (fn: ArrOrdFunc): (arr: ArrayLike) => T; } /** * Return max value in array, depending on result of calling `fn` */ export const maxBy = curryN(2, (fn: ArrOrdFunc, arr: ArrayLike = []) => { let result; let max: Ord = -Infinity; for (let i = 0; i < arr.length; i++) { const computed = fn(arr[i], i, arr); if (computed > max) { max = computed; result = arr[i]; } } return result; }) as MaxBy