@monstermann/fn
Version:
A utility library for TypeScript.
39 lines (37 loc) • 883 B
JavaScript
import { dfdlT } from "@monstermann/dfdl";
//#region src/array/medianOrElse.ts
/**
* `medianOrElse(array, orElse)`
*
* Returns the median value from `array`, or calls `orElse` if the array is empty.
*
* ```ts
* medianOrElse([1, 3, 5], () => 0); // 3
* medianOrElse([1, 2, 3, 4], () => 0); // 2.5
* medianOrElse([], () => 0); // 0
* ```
*
* ```ts
* pipe(
* [1, 3, 5],
* medianOrElse(() => 0),
* ); // 3
* pipe(
* [1, 2, 3, 4],
* medianOrElse(() => 0),
* ); // 2.5
* pipe(
* [],
* medianOrElse(() => 0),
* ); // 0
* ```
*/
const medianOrElse = dfdlT((target, orElse) => {
if (target.length === 0) return orElse(target);
const sorted = target.toSorted((a, b) => a - b);
const mid = Math.floor(sorted.length / 2);
if (sorted.length % 2 === 0) return (sorted[mid - 1] + sorted[mid]) / 2;
else return sorted[mid];
}, 2);
//#endregion
export { medianOrElse };