X-Git-Url: https://git.ladys.computer/Etiquette/blobdiff_plain/9f6c704b8d1ebe70e97b0d934d04c71e8ae0ed5f..f8903c5b3bd12d02af174e5043d906d63da0b0d1:/memory.js?ds=inline diff --git a/memory.js b/memory.js index 252418b..f4a861b 100644 --- a/memory.js +++ b/memory.js @@ -1,14 +1,19 @@ -// 📧🏷️ Étiquette ∷ memory.js -// ==================================================================== -// -// Copyright © 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 -// file, You can obtain one at . +// SPDX-FileCopyrightText: 2023, 2025 Lady +// SPDX-License-Identifier: MPL-2.0 +/** + * ⁌ 📧🏷️ Étiquette ∷ memory.js + * + * Copyright © 2023, 2025 Lady [@ Ladys 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 + * file, You can obtain one at . + */ import { wrmgBase32Binary, wrmgBase32String } from "./deps.js"; +const ÉTIQUETTE = "📧🏷️ Étiquette"; + /** * A symbol which is used internally to identify the constructor * associated with a stored object. @@ -23,7 +28,7 @@ const constructorSymbol = Symbol("constructor"); * If an argument is provided, it is used as the underlying numeric * value for the identifier. * - * The return value is a `String` *object* with a `.value` own property + * The return value is a `String´ ⹐object⹑ with a `.value´ own property * giving the underlying numeric value for the string. * * ※ This function is not exposed. @@ -83,7 +88,7 @@ const normalizeID = ($) => { if (byteLength != 4) { // ☡ The identifier was of unexpected size. throw new RangeError( - `Expected id to fit within 4 bytes, but got ${byteLength}.`, + `${ÉTIQUETTE}: Expected id to fit within 4 bytes, but got ${byteLength}.`, ); } else { // The identifier was correctly‐sized. @@ -94,14 +99,16 @@ const normalizeID = ($) => { // // ※ This should be impossible and indicates something went // very wrong in base32 decoding. - throw new RangeError("Unexpected values in lower two bits"); + throw new RangeError( + `${ÉTIQUETTE}: Unexpected values in lower two bits`, + ); } else { // The final two bits are zero as expected. const number = value >>> 2; if (checksum != number % 37) { // ☡ The checksum does not match the number. throw new RangeError( - `Invalid checksum for id: ${identifier} (${number})`, + `${ÉTIQUETTE}: Invalid checksum for id: ${identifier} (${number})`, ); } else { // The checksum matches. Mint a new identifier with the same @@ -117,7 +124,7 @@ const normalizeID = ($) => { * A symbol which is used to identify the method for constructing a new * instance of a constructor based on stored data. * - * ※ This value is exposed as `Storage.toInstance`. + * ※ This value is exposed as `Storage.toInstance´. */ const toInstanceSymbol = Symbol("Storage.toInstance"); @@ -126,7 +133,7 @@ const toInstanceSymbol = Symbol("Storage.toInstance"); * instance into an object of enumerable own properties suitable for * persistence. * - * ※ This value is exposed as `Storage.toObject`. + * ※ This value is exposed as `Storage.toObject´. */ const toObjectSymbol = Symbol("Storage.toObject"); @@ -136,7 +143,7 @@ const toObjectSymbol = Symbol("Storage.toObject"); */ export class Storage { static { - // Define `Storage.toInstance` and `Storage.toObject` as + // Define `Storage.toInstance´ and `Storage.toObject´ as // nonconfigurable, non·enumerable, read·only properties with the // appropriate values. Object.defineProperties(this, { @@ -156,15 +163,15 @@ export class Storage { } /** - * A `Set` of deleted identifiers, to ensure they are not + * A `Set´ of deleted identifiers, to ensure they are not * re·assigned. * - * The identifier `000-0000` is deleted from the start and can only + * The identifier `000-0000´ is deleted from the start and can only * be manually set. */ #deleted = new Set([`${mintID(0)}`]); - /** The `Map` used to actually store the data internally. */ + /** The `Map´ used to actually store the data internally. */ #store = new Map(); /** @@ -180,7 +187,7 @@ export class Storage { // ☡ There is no method on the constructor for generating an // instance. throw new TypeError( - "Constructor must implement Storage.toInstance for object to be retrieved.", + `${ÉTIQUETTE}: Constructor must implement Storage.toInstance for object to be retrieved.`, ); } else { // Generate an instance and return it. @@ -204,7 +211,7 @@ export class Storage { // The provided value does not have a method for generating an // object to store. throw new TypeError( - "Object must implement Storage.toObject to be stored.", + `${ÉTIQUETTE}: Object must implement Storage.toObject to be stored.`, ); } else { // The provided value has a method for generating a storage @@ -289,9 +296,9 @@ export class Storage { * constructed from data in storage. * * The callback function will be called with the constructed - * instance, its identifier, and this `Storage` instance. + * instance, its identifier, and this `Storage´ instance. * - * If a second argument is provided, it will be used as the `this` + * If a second argument is provided, it will be used as the `this´ * value. */ forEach(callback, thisArg = undefined) { @@ -304,7 +311,7 @@ export class Storage { /** * Returns an instance constructed from the data stored at the - * provided identifier, or `null` if the identifier has no data. + * provided identifier, or `null´ if the identifier has no data. */ get(id) { const store = this.#store; @@ -336,7 +343,7 @@ export class Storage { /** * Sets the data for the provided identifier to be that generated - * from the provided instance, then returns this `Storage` object. + * from the provided instance, then returns this `Storage´ object. */ set(id, instance) { this.#persist(instance, normalizeID(id)); @@ -347,7 +354,7 @@ export class Storage { * Returns the number of identifiers with data in storage. * * ☡ This number may be smaller than the actual number of used - * identifiers, as deleted identifiers are *not* freed up for re·use. + * identifiers, as deleted identifiers are ⹐not⹑ freed up for re·use. */ get size() { return this.#store.size;