{"version":3,"file":"_randomNumber.mjs","names":[],"sources":["../../src/internal/_randomNumber.ts"],"sourcesContent":["import { OpenApi } from \"@typia/interface\";\n\nimport { _randomMultiple } from \"./_randomMultiple\";\n\nexport const _randomNumber = (schema: OpenApi.IJsonSchema.INumber): number => {\n  const lower: IBoundary | null = getLowerBoundary(schema);\n  const upper: IBoundary | null = getUpperBoundary(schema);\n  const minimum: number =\n    lower?.value ?? (upper === null ? 0 : upper.value - 100);\n  const maximum: number =\n    upper?.value ?? (lower === null ? 100 : lower.value + 100);\n  if (minimum > maximum)\n    throw new Error(\"Minimum value is greater than maximum value.\");\n  return schema.multipleOf === undefined\n    ? scalar({\n        minimum,\n        maximum,\n        exclusiveMinimum: lower?.exclusive ?? false,\n        exclusiveMaximum: upper?.exclusive ?? false,\n      })\n    : _randomMultiple({\n        minimum,\n        maximum,\n        multipleOf: schema.multipleOf,\n        exclusiveMinimum: lower?.exclusive ?? false,\n        exclusiveMaximum: upper?.exclusive ?? false,\n        integer: false,\n      });\n};\n\nconst scalar = (props: {\n  minimum: number;\n  maximum: number;\n  exclusiveMinimum: boolean;\n  exclusiveMaximum: boolean;\n}): number => {\n  if (\n    props.minimum === props.maximum &&\n    (props.exclusiveMinimum || props.exclusiveMaximum)\n  )\n    throw new Error(\"Exclusive numeric range is empty.\");\n  const value: number =\n    Math.random() * (props.maximum - props.minimum) + props.minimum;\n  if (\n    (props.exclusiveMinimum && value === props.minimum) ||\n    (props.exclusiveMaximum && value === props.maximum)\n  ) {\n    const middle: number = props.minimum + (props.maximum - props.minimum) / 2;\n    if (middle <= props.minimum || middle >= props.maximum)\n      throw new Error(\"Exclusive numeric range has no representable value.\");\n    return middle;\n  }\n  return value;\n};\n\nconst getLowerBoundary = (\n  schema: OpenApi.IJsonSchema.INumber,\n): IBoundary | null =>\n  selectBoundary(\n    schema.minimum === undefined\n      ? null\n      : { value: schema.minimum, exclusive: false },\n    schema.exclusiveMinimum === undefined\n      ? null\n      : { value: schema.exclusiveMinimum, exclusive: true },\n    Math.max,\n  );\n\nconst getUpperBoundary = (\n  schema: OpenApi.IJsonSchema.INumber,\n): IBoundary | null =>\n  selectBoundary(\n    schema.maximum === undefined\n      ? null\n      : { value: schema.maximum, exclusive: false },\n    schema.exclusiveMaximum === undefined\n      ? null\n      : { value: schema.exclusiveMaximum, exclusive: true },\n    Math.min,\n  );\n\nconst selectBoundary = (\n  x: IBoundary | null,\n  y: IBoundary | null,\n  compare: (x: number, y: number) => number,\n): IBoundary | null => {\n  if (x === null) return y;\n  if (y === null) return x;\n  if (x.value === y.value)\n    return { value: x.value, exclusive: x.exclusive || y.exclusive };\n  return compare(x.value, y.value) === x.value ? x : y;\n};\n\ninterface IBoundary {\n  value: number;\n  exclusive: boolean;\n}\n"],"mappings":";;AAIA,MAAa,iBAAiB,WAAgD;CAC5E,MAAM,QAA0B,iBAAiB,MAAM;CACvD,MAAM,QAA0B,iBAAiB,MAAM;CACvD,MAAM,UACJ,OAAO,UAAU,UAAU,OAAO,IAAI,MAAM,QAAQ;CACtD,MAAM,UACJ,OAAO,UAAU,UAAU,OAAO,MAAM,MAAM,QAAQ;CACxD,IAAI,UAAU,SACZ,MAAM,IAAI,MAAM,8CAA8C;CAChE,OAAO,OAAO,eAAe,KAAA,IACzB,OAAO;EACL;EACA;EACA,kBAAkB,OAAO,aAAa;EACtC,kBAAkB,OAAO,aAAa;CACxC,CAAC,IACD,gBAAgB;EACd;EACA;EACA,YAAY,OAAO;EACnB,kBAAkB,OAAO,aAAa;EACtC,kBAAkB,OAAO,aAAa;EACtC,SAAS;CACX,CAAC;AACP;AAEA,MAAM,UAAU,UAKF;CACZ,IACE,MAAM,YAAY,MAAM,YACvB,MAAM,oBAAoB,MAAM,mBAEjC,MAAM,IAAI,MAAM,mCAAmC;CACrD,MAAM,QACJ,KAAK,OAAO,KAAK,MAAM,UAAU,MAAM,WAAW,MAAM;CAC1D,IACG,MAAM,oBAAoB,UAAU,MAAM,WAC1C,MAAM,oBAAoB,UAAU,MAAM,SAC3C;EACA,MAAM,SAAiB,MAAM,WAAW,MAAM,UAAU,MAAM,WAAW;EACzE,IAAI,UAAU,MAAM,WAAW,UAAU,MAAM,SAC7C,MAAM,IAAI,MAAM,qDAAqD;EACvE,OAAO;CACT;CACA,OAAO;AACT;AAEA,MAAM,oBACJ,WAEA,eACE,OAAO,YAAY,KAAA,IACf,OACA;CAAE,OAAO,OAAO;CAAS,WAAW;AAAM,GAC9C,OAAO,qBAAqB,KAAA,IACxB,OACA;CAAE,OAAO,OAAO;CAAkB,WAAW;AAAK,GACtD,KAAK,GACP;AAEF,MAAM,oBACJ,WAEA,eACE,OAAO,YAAY,KAAA,IACf,OACA;CAAE,OAAO,OAAO;CAAS,WAAW;AAAM,GAC9C,OAAO,qBAAqB,KAAA,IACxB,OACA;CAAE,OAAO,OAAO;CAAkB,WAAW;AAAK,GACtD,KAAK,GACP;AAEF,MAAM,kBACJ,GACA,GACA,YACqB;CACrB,IAAI,MAAM,MAAM,OAAO;CACvB,IAAI,MAAM,MAAM,OAAO;CACvB,IAAI,EAAE,UAAU,EAAE,OAChB,OAAO;EAAE,OAAO,EAAE;EAAO,WAAW,EAAE,aAAa,EAAE;CAAU;CACjE,OAAO,QAAQ,EAAE,OAAO,EAAE,KAAK,MAAM,EAAE,QAAQ,IAAI;AACrD"}