import exactArguments from '../../_utils/exactArguments';

/**
 * @name factorial
 * @summary Returns the factorial of a number.
 *
 * @description Returns the factorial of a number.
 *
 * @example
 * // Normal usage
 * let result = factorial(4);
 * // => 24
 *
 * @param {numberr} a numbers given.
 * @returns {number}
 *
 * @function pure
 */
export default function factorial(a: number): number {
  exactArguments(1, arguments);

  return factorialStep(a);
}

function factorialStep(a: number): number {
  if (a === 1 || a === 0) {
    return 1;
  }

  return a * factorialStep(a - 1);
}
