import { isObjectLike } from './isObjectLike.ts';
import { getTag } from '../_internal/getTag.ts';
import { numberTag } from '../_internal/tags.ts';

/**
 * Checks if a given value is a number.
 *
 * This function can also serve as a type predicate in TypeScript, narrowing the type of the argument to `number`.
 *
 * @param value The value to check if it is a number.
 * @returns Returns `true` if `value` is a number, else `false`.
 *
 * @example
 * const value1 = 123;
 * const value2 = 'abc';
 * const value3 = true;
 *
 * console.log(isNumber(value1)); // true
 * console.log(isNumber(value2)); // false
 * console.log(isNumber(value3)); // false
 */
export function isNumber(value?: any): value is number {
  return typeof value === 'number' || (isObjectLike(value) && getTag(value) === numberTag);
}
