// ♓🌟 Piscēs ∷ numeric.js
// ====================================================================
//
-// Copyright © 2022 Lady [@ Lady’s Computer].
+// Copyright © 2022–2023 Lady [@ Lady’s Computer].
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
clz32: ($) => {
const n = toNumeric($);
return clz32(
- typeof n === "bigint" ? toNumber(toUintN(32, n)) : n,
+ typeof n === "bigint"
+ ? toNumber(toUnsignedIntegralNumeric(32, n))
+ : n,
);
},
toFloat32: ($) => fround(toNumber($)),
};
})();
-export const {
- /**
- * Returns the result of converting the provided value to fit within
- * the provided number of bits as a signed integer.
- *
- * ※ Unlike BigInt.asIntN, this function accepts both big·int and
- * number values.
- *
- * ☡ The first argument, the number of bits, must be a number.
- */
- toIntN,
-
- /**
- * Returns the result of converting the provided value to fit within
- * the provided number of bits as an unsigned integer.
- *
- * ※ Unlike BigInt.asUintN, this function accepts both big·int and
- * number values.
- *
- * ☡ The first argument, the number of bits, must be a number.
- */
- toUintN,
-} = (() => {
- const { asIntN, asUintN } = BigInt;
- return {
- toIntN: (n, $) => {
- const prim = toPrimitive($);
- if (typeof prim === "bigint") {
- // The primitive value is a big·int.
- return asIntN(n, prim);
- } else {
- // The primitive value is not a big·int.
- const int = trunc(prim);
- if (!isFiniteNumber(int) || int == 0) {
- // The truncated value is zero or not finite.
- return 0;
- } else {
- // The truncated value is finite.
- return toNumber(asIntN(n, toBigInt(int)));
- }
- }
- },
- toUintN: (n, $) => {
- const prim = toPrimitive($);
- if (typeof prim === "bigint") {
- // The primitive value is a big·int.
- return asUintN(n, prim);
- } else {
- // The primitive value is not a big·int.
- const int = trunc(prim);
- if (!isFiniteNumber(int) || int == 0) {
- // The truncated value is zero or not finite.
- return 0;
- } else {
- // The truncated value is finite.
- return toNumber(asUintN(n, toBigInt(int)));
- }
- }
- },
- };
-})();
-
/**
* Returns the result of converting the provided number to an integral
* number.
const primValue = toPrimitive($, "number");
return typeof primValue === "bigint" ? primValue : +primValue;
};
+
+export const {
+ /**
+ * Returns the result of converting the provided value to fit within
+ * the provided number of bits as a signed integer.
+ *
+ * ※ Unlike BigInt.asIntN, this function accepts both big·int and
+ * number values.
+ *
+ * ☡ The first argument, the number of bits, must be a number.
+ */
+ toSignedIntegralNumeric,
+
+ /**
+ * Returns the result of converting the provided value to fit within
+ * the provided number of bits as an unsigned integer.
+ *
+ * ※ Unlike BigInt.asUintN, this function accepts both big·int and
+ * number values.
+ *
+ * ☡ The first argument, the number of bits, must be a number.
+ */
+ toUnsignedIntegralNumeric,
+} = (() => {
+ const { asIntN, asUintN } = BigInt;
+ return {
+ toSignedIntegralNumeric: (n, $) => {
+ const prim = toPrimitive($);
+ if (typeof prim === "bigint") {
+ // The primitive value is a big·int.
+ return asIntN(n, prim);
+ } else {
+ // The primitive value is not a big·int.
+ const int = trunc(prim);
+ if (!isFiniteNumber(int) || int == 0) {
+ // The truncated value is zero or not finite.
+ return 0;
+ } else {
+ // The truncated value is finite.
+ return toNumber(asIntN(n, toBigInt(int)));
+ }
+ }
+ },
+ toUnsignedIntegralNumeric: (n, $) => {
+ const prim = toPrimitive($);
+ if (typeof prim === "bigint") {
+ // The primitive value is a big·int.
+ return asUintN(n, prim);
+ } else {
+ // The primitive value is not a big·int.
+ const int = trunc(prim);
+ if (!isFiniteNumber(int) || int == 0) {
+ // The truncated value is zero or not finite.
+ return 0;
+ } else {
+ // The truncated value is finite.
+ return toNumber(asUintN(n, toBigInt(int)));
+ }
+ }
+ },
+ };
+})();
// ♓🌟 Piscēs ∷ numeric.test.js
// ====================================================================
//
-// Copyright © 2022 Lady [@ Lady’s Computer].
+// Copyright © 2022–2023 Lady [@ Lady’s Computer].
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
toFloat32,
toIntegralNumber,
toIntegralNumberOrInfinity,
- toIntN,
toNumber,
toNumeric,
- toUintN,
+ toSignedIntegralNumeric,
+ toUnsignedIntegralNumeric,
} from "./numeric.js";
describe("NEGATIVE_ZERO", () => {
});
});
-describe("toIntN", () => {
+describe("toSignedIntegralNumeric", () => {
it("[[Call]] converts to an int·n", () => {
- assertStrictEquals(toIntN(2, 7n), -1n);
+ assertStrictEquals(toSignedIntegralNumeric(2, 7n), -1n);
});
it("[[Call]] works with numbers", () => {
- assertStrictEquals(toIntN(2, 7), -1);
+ assertStrictEquals(toSignedIntegralNumeric(2, 7), -1);
});
it("[[Call]] works with non‐integers", () => {
- assertStrictEquals(toIntN(2, 7.21), -1);
- assertStrictEquals(toIntN(2, Infinity), 0);
+ assertStrictEquals(toSignedIntegralNumeric(2, 7.21), -1);
+ assertStrictEquals(toSignedIntegralNumeric(2, Infinity), 0);
});
});
});
});
-describe("toUintN", () => {
+describe("toUnsignedIntegralNumeric", () => {
it("[[Call]] converts to an int·n", () => {
- assertStrictEquals(toUintN(2, 7n), 3n);
+ assertStrictEquals(toUnsignedIntegralNumeric(2, 7n), 3n);
});
it("[[Call]] works with numbers", () => {
- assertStrictEquals(toUintN(2, 7), 3);
+ assertStrictEquals(toUnsignedIntegralNumeric(2, 7), 3);
});
it("[[Call]] works with non‐integers", () => {
- assertStrictEquals(toUintN(2, 7.21), 3);
- assertStrictEquals(toUintN(2, Infinity), 0);
+ assertStrictEquals(toUnsignedIntegralNumeric(2, 7.21), 3);
+ assertStrictEquals(toUnsignedIntegralNumeric(2, Infinity), 0);
});
});