File size: 3,374 Bytes
96af7c9 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.double = double;
const ArrayInt64_1 = require("./_internals/helpers/ArrayInt64");
const ArrayInt64Arbitrary_1 = require("./_internals/ArrayInt64Arbitrary");
const DoubleHelpers_1 = require("./_internals/helpers/DoubleHelpers");
const DoubleOnlyHelpers_1 = require("./_internals/helpers/DoubleOnlyHelpers");
const safeNumberIsInteger = Number.isInteger;
const safeNumberIsNaN = Number.isNaN;
const safeNegativeInfinity = Number.NEGATIVE_INFINITY;
const safePositiveInfinity = Number.POSITIVE_INFINITY;
const safeMaxValue = Number.MAX_VALUE;
const safeNaN = Number.NaN;
function safeDoubleToIndex(d, constraintsLabel) {
if (safeNumberIsNaN(d)) {
throw new Error('fc.double constraints.' + constraintsLabel + ' must be a 64-bit float');
}
return (0, DoubleHelpers_1.doubleToIndex)(d);
}
function unmapperDoubleToIndex(value) {
if (typeof value !== 'number')
throw new Error('Unsupported type');
return (0, DoubleHelpers_1.doubleToIndex)(value);
}
function numberIsNotInteger(value) {
return !safeNumberIsInteger(value);
}
function anyDouble(constraints) {
const { noDefaultInfinity = false, noNaN = false, minExcluded = false, maxExcluded = false, min = noDefaultInfinity ? -safeMaxValue : safeNegativeInfinity, max = noDefaultInfinity ? safeMaxValue : safePositiveInfinity, } = constraints;
const minIndexRaw = safeDoubleToIndex(min, 'min');
const minIndex = minExcluded ? (0, ArrayInt64_1.add64)(minIndexRaw, ArrayInt64_1.Unit64) : minIndexRaw;
const maxIndexRaw = safeDoubleToIndex(max, 'max');
const maxIndex = maxExcluded ? (0, ArrayInt64_1.substract64)(maxIndexRaw, ArrayInt64_1.Unit64) : maxIndexRaw;
if ((0, ArrayInt64_1.isStrictlySmaller64)(maxIndex, minIndex)) {
throw new Error('fc.double constraints.min must be smaller or equal to constraints.max');
}
if (noNaN) {
return (0, ArrayInt64Arbitrary_1.arrayInt64)(minIndex, maxIndex).map(DoubleHelpers_1.indexToDouble, unmapperDoubleToIndex);
}
const positiveMaxIdx = (0, ArrayInt64_1.isStrictlyPositive64)(maxIndex);
const minIndexWithNaN = positiveMaxIdx ? minIndex : (0, ArrayInt64_1.substract64)(minIndex, ArrayInt64_1.Unit64);
const maxIndexWithNaN = positiveMaxIdx ? (0, ArrayInt64_1.add64)(maxIndex, ArrayInt64_1.Unit64) : maxIndex;
return (0, ArrayInt64Arbitrary_1.arrayInt64)(minIndexWithNaN, maxIndexWithNaN).map((index) => {
if ((0, ArrayInt64_1.isStrictlySmaller64)(maxIndex, index) || (0, ArrayInt64_1.isStrictlySmaller64)(index, minIndex))
return safeNaN;
else
return (0, DoubleHelpers_1.indexToDouble)(index);
}, (value) => {
if (typeof value !== 'number')
throw new Error('Unsupported type');
if (safeNumberIsNaN(value))
return !(0, ArrayInt64_1.isEqual64)(maxIndex, maxIndexWithNaN) ? maxIndexWithNaN : minIndexWithNaN;
return (0, DoubleHelpers_1.doubleToIndex)(value);
});
}
function double(constraints = {}) {
if (!constraints.noInteger) {
return anyDouble(constraints);
}
return anyDouble((0, DoubleOnlyHelpers_1.refineConstraintsForDoubleOnly)(constraints))
.map(DoubleOnlyHelpers_1.doubleOnlyMapper, DoubleOnlyHelpers_1.doubleOnlyUnmapper)
.filter(numberIsNotInteger);
}
|