From: Lady Date: Sun, 25 Jun 2023 05:19:23 +0000 (-0700) Subject: Rename to{I∣Ui}ntN to to{S∣Uns}ignedIntegralNumeric X-Git-Tag: 0.4.0~6 X-Git-Url: https://git.ladys.computer/Pisces/commitdiff_plain/674870ec64c2fa52cad91dc59416398529259369?ds=sidebyside;hp=6413f2e49d537f7ad7c0000939736fb71fc3930d Rename to{I∣Ui}ntN to to{S∣Uns}ignedIntegralNumeric “int·N” and “u·int·N” are not really ♓🌟 Piscēs terms. --- diff --git a/numeric.js b/numeric.js index 4a066f7..02ca876 100644 --- a/numeric.js +++ b/numeric.js @@ -1,7 +1,7 @@ // ♓🌟 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 @@ -444,7 +444,9 @@ export const { 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($)), @@ -679,68 +681,6 @@ export const { }; })(); -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. @@ -803,3 +743,65 @@ export const toNumeric = ($) => { 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))); + } + } + }, + }; +})(); diff --git a/numeric.test.js b/numeric.test.js index 27776cd..4d3d2cb 100644 --- a/numeric.test.js +++ b/numeric.test.js @@ -1,7 +1,7 @@ // ♓🌟 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 @@ -28,10 +28,10 @@ import { toFloat32, toIntegralNumber, toIntegralNumberOrInfinity, - toIntN, toNumber, toNumeric, - toUintN, + toSignedIntegralNumeric, + toUnsignedIntegralNumeric, } from "./numeric.js"; describe("NEGATIVE_ZERO", () => { @@ -206,18 +206,18 @@ describe("toFloat32", () => { }); }); -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); }); }); @@ -306,17 +306,17 @@ describe("toNumeric", () => { }); }); -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); }); });