{"version":3,"file":"randomInteger.js","names":[],"sources":["../src/randomInteger.ts"],"sourcesContent":["import type {\n  GreaterThan,\n  GreaterThanOrEqual,\n  IsEqual,\n  IsNever,\n  NonNegativeInteger,\n  Or,\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  Or<\n    IsNever<NonNegativeInteger<From>>,\n    IsNever<NonNegativeInteger<To>>\n  > 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":"AAgDA,SAAgB,EACd,EACA,EACyB,CACzB,IAAM,EAAa,KAAK,KAAK,EAAK,CAC5B,EAAY,KAAK,MAAM,EAAG,CAEhC,GAAI,EAAY,EACd,MAAU,WACR,6BAA6B,EAAK,UAAU,CAAC,GAAG,EAAG,UAAU,CAAC,uBAC/D,CAGH,OAAO,KAAK,MACV,KAAK,QAAQ,EAAI,EAAY,EAAa,GAAK,EAChD"}