All files / utils/src/utilities/math toNumber.ts

45% Statements 9/20
41.66% Branches 10/24
50% Functions 3/6
50% Lines 9/18

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75      122x                                             151x 29x     122x 90x 90x     32x 144x 144x                                                                          
type NumberLike = string | String | number | Number;
 
function isNumberLike(value: unknown): value is NumberLike {
  return (
    typeof value === 'string' ||
    typeof value === 'number' ||
    value instanceof String ||
    value instanceof Number
  );
}
 
/**
 * Converts a value to a finite number, returning undefined if the value is not finite.
 *
 * @param value - The value to convert to a finite number
 * @returns The finite number value, or undefined if the value is not finite
 */
export function toFiniteNumber(
  value: NumberLike | undefined
): number | undefined;
export function toFiniteNumber<T extends NumberLike>(
  value: ArrayLike<T> | undefined
): number[] | undefined;
export function toFiniteNumber<T extends NumberLike>(
  value: T | ArrayLike<T> | undefined
): number | undefined | number[] {
  if (value === undefined) {
    return undefined;
  }
 
  if (isNumberLike(value)) {
    const converted = Number(value);
    return Number.isFinite(converted) ? converted : undefined;
  }
 
  return Array.from(value, (entry) => {
    const converted = Number(entry);
    return Number.isFinite(converted) ? converted : undefined;
  }) as number[];
}
 
/**
 * Coerces DICOM-friendly numeric inputs to number(s).
 *
 * @param val - The javascript object for the specified element in the metadata
 * @returns finite number(s); invalid values are coerced to NaN
 */
export function toNumber(
  val: NumberLike | null | undefined
): number | undefined;
export function toNumber<T extends NumberLike>(
  val: ArrayLike<T> | Iterable<T>
): number[];
export function toNumber(val: unknown): number | number[] | undefined {
  if (val === undefined || val === null) {
    return undefined;
  }
 
  if (isNumberLike(val)) {
    return Number(val);
  }
 
  if (Array.isArray(val)) {
    return val.map((entry) => Number(entry));
  }
 
  if (typeof val === 'object' && Symbol.iterator in val) {
    return Array.from(val as Iterable<unknown>, (entry) => Number(entry));
  }
 
  return Number(val as NumberLike);
}
 
export default toNumber;