{"version":3,"file":"randomInteger.cjs","names":[],"sources":["../src/randomInteger.ts"],"sourcesContent":["import type {\n  GreaterThan,\n  GreaterThanOrEqual,\n  IsEqual,\n  IsNever,\n  NonNegativeInteger,\n} from \"type-fest\";\nimport type { IntRangeInclusive } from \"./internal/types/IntRangeInclusive\";\n\n// This limitation is defined by type-fest\ntype MaxLiteral = 1000;\n\ntype RandomInteger<From extends number, To extends number> =\n  IsNever<NonNegativeInteger<From>> extends true\n    ? number\n    : IsNever<NonNegativeInteger<To>> extends true\n      ? number\n      : IsEqual<From, To> extends true\n        ? From\n        : GreaterThan<From, To> extends true\n          ? never\n          : GreaterThanOrEqual<To, MaxLiteral> extends true\n            ? number\n            : IntRangeInclusive<From, To>;\n\n/**\n * Generate a random integer between `from` and `to` (inclusive).\n *\n * !Important: This function uses [`Math.random()`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random) under-the-hood, which has two major limitations:\n * 1. It generates 2^52 possible values, so the bigger the range, the less\n * uniform the distribution of values would be, and at ranges larger than that\n * some values would never come up.\n * 2. It is not cryptographically secure and should not be used for security\n * scenarios.\n *\n * @param from - The minimum value.\n * @param to - The maximum value.\n * @returns The random integer.\n * @signature\n *   randomInteger(from, to)\n * @example\n *   randomInteger(1, 10) // => 5\n *   randomInteger(1.5, 2.6) // => 2\n * @dataFirst\n * @category Number\n */\nexport function randomInteger<From extends number, To extends number>(\n  from: From,\n  to: To,\n): RandomInteger<From, To> {\n  const fromCeiled = Math.ceil(from);\n  const toFloored = Math.floor(to);\n\n  if (toFloored < fromCeiled) {\n    throw new RangeError(\n      `randomInteger: The range [${from.toString()},${to.toString()}] contains no integer`,\n    );\n  }\n\n  return Math.floor(\n    Math.random() * (toFloored - fromCeiled + 1) + fromCeiled,\n  ) as RandomInteger<From, To>;\n}\n"],"mappings":"mEA8CA,SAAgB,EACd,EACA,EACyB,CACzB,IAAM,EAAa,KAAK,KAAK,CAAI,EAC3B,EAAY,KAAK,MAAM,CAAE,EAE/B,GAAI,EAAY,EACd,MAAU,WACR,6BAA6B,EAAK,SAAS,EAAE,GAAG,EAAG,SAAS,EAAE,sBAChE,EAGF,OAAO,KAAK,MACV,KAAK,OAAO,GAAK,EAAY,EAAa,GAAK,CACjD,CACF"}