]> Lady’s Gitweb - Pisces/commitdiff
Refactor object.js to use createArrowFunction
authorLady <redacted>
Sun, 5 Nov 2023 21:11:51 +0000 (16:11 -0500)
committerLady <redacted>
Sun, 5 Nov 2023 21:11:51 +0000 (16:11 -0500)
object.js

index 3115c3bbfe6059b2edc437950daad8120932db7e..83519fd8b0f9a9f0a59517631c30be4fbfa97453 100644 (file)
--- a/object.js
+++ b/object.js
@@ -7,7 +7,12 @@
 // License, v. 2.0. If a copy of the MPL was not distributed with this
 // file, You can obtain one at <https://mozilla.org/MPL/2.0/>.
 
-import { bind, call, toFunctionName } from "./function.js";
+import {
+  bind,
+  call,
+  createArrowFunction,
+  toFunctionName,
+} from "./function.js";
 import { ITERATOR, SPECIES, toPrimitive, type } from "./value.js";
 
 /**
@@ -402,15 +407,18 @@ export const { PropertyDescriptor } = (() => {
   return { PropertyDescriptor };
 })();
 
-export const {
-  /**
-   * Defines an own property on the provided object on the provided
-   * property key using the provided property descriptor.
-   *
-   * ※ This is effectively an alias for `Object.defineProperty`.
-   */
-  defineOwnProperty,
+/**
+ * Defines an own property on the provided object on the provided
+ * property key using the provided property descriptor.
+ *
+ * ※ This is effectively an alias for `Object.defineProperty`.
+ */
+export const defineOwnProperty = createArrowFunction(
+  Object.defineProperty,
+  { name: "defineOwnProperty" },
+);
 
+export const {
   /**
    * Defines own properties on the provided object using the
    * descriptors on the enumerable own properties of the provided
@@ -422,77 +430,26 @@ export const {
   defineOwnProperties,
 
   /**
-   * Marks the provided object as non·extensible and marks all its
-   * properties as nonconfigurable and (if data properties)
-   * nonwritable, and returns the object.
-   *
-   * ※ This is effectively an alias for `Object.freeze`.
-   */
-  freeze,
-
-  /**
-   * Returns the property descriptor for the own property with the
-   * provided property key on the provided object, or null if none
-   * exists.
-   *
-   * ※ This is effectively an alias for
-   * `Object.getOwnPropertyDescriptor`.
-   */
-  getOwnPropertyDescriptor,
-
-  /**
-   * Returns the property descriptors for the own properties on the
-   * provided object.
-   *
-   * ※ This is effectively an alias for
-   * `Object.getOwnPropertyDescriptors`.
-   */
-  getOwnPropertyDescriptors,
-
-  /**
-   * Returns an array of string‐valued own property keys on the
-   * provided object.
-   *
-   * ☡ This includes both enumerable and non·enumerable properties.
-   *
-   * ※ This is effectively an alias for `Object.getOwnPropertyNames`.
-   */
-  getOwnPropertyStrings,
-
-  /**
-   * Returns an array of symbol‐valued own property keys on the
-   * provided object.
-   *
-   * ☡ This includes both enumerable and non·enumerable properties.
-   *
-   * ※ This is effectively an alias for
-   * `Object.getOwnPropertySymbols`.
-   */
-  getOwnPropertySymbols,
-
-  /**
-   * Returns the prototype of the provided object.
+   * Returns a new frozen shallow copy of the enumerable own properties
+   * of the provided object, according to the following rules :—
    *
-   * ※ This is effectively an alias for `Object.getPrototypeOf`.
-   */
-  getPrototype,
-
-  /**
-   * Returns whether the provided object has an own property with the
-   * provided property key.
+   * - For data properties, create a nonconfigurable, nonwritable
+   *   property with the same value.
    *
-   * ※ This is effectively an alias for `Object.hasOwn`.
-   */
-  hasOwnProperty,
-
-  /**
-   * Returns whether the provided object is extensible.
+   * - For accessor properties, create a nonconfigurable accessor
+   *   property with the same getter *and* setter.
    *
-   * ※ This function returns false for nonobjects.
+   * The prototype for the resulting object will be taken from the
+   * `.prototype` property of the provided constructor, or the
+   * `.prototype` of the `.constructor` of the provided object if the
+   * provided constructor is undefined. If the used constructor has a
+   * nonnullish `.[Symbol.species]`, that will be used instead. If the
+   * used constructor or species is nullish or does not have a
+   * `.prototype` property, the prototype is set to null.
    *
-   * ※ This is effectively an alias for `Object.isExtensible`.
+   * ※ The prototype of the provided object itself is ignored.
    */
-  isExtensibleObject,
+  frozenCopy,
 
   /**
    * Returns whether the provided object is frozen.
@@ -512,69 +469,6 @@ export const {
    */
   isUnsealedObject,
 
-  /**
-   * Returns an array of key~value pairs for the enumerable,
-   * string‐valued property keys on the provided object.
-   *
-   * ※ This is effectively an alias for `Object.entries`.
-   */
-  namedEntries,
-
-  /**
-   * Returns an array of the enumerable, string‐valued property keys on
-   * the provided object.
-   *
-   * ※ This is effectively an alias for `Object.keys`.
-   */
-  namedKeys,
-
-  /**
-   * Returns an array of property values for the enumerable,
-   * string‐valued property keys on the provided object.
-   *
-   * ※ This is effectively an alias for `Object.values`.
-   */
-  namedValues,
-
-  /**
-   * Returns a new object with the provided prototype and property
-   * descriptors.
-   *
-   * ※ This is effectively an alias for `Object.create`.
-   */
-  objectCreate,
-
-  /**
-   * Returns a new object with the provided property keys and values.
-   *
-   * ※ This is effectively an alias for `Object.fromEntries`.
-   */
-  objectFromEntries,
-
-  /**
-   * Marks the provided object as non·extensible, and returns the
-   * object.
-   *
-   * ※ This is effectively an alias for `Object.preventExtensions`.
-   */
-  preventExtensions,
-
-  /**
-   * Marks the provided object as non·extensible and marks all its
-   * properties as nonconfigurable, and returns the object.
-   *
-   * ※ This is effectively an alias for `Object.seal`.
-   */
-  seal,
-
-  /**
-   * Sets the values of the enumerable own properties of the provided
-   * additional objects on the provided object.
-   *
-   * ※ This is effectively an alias for `Object.assign`.
-   */
-  setPropertyValues,
-
   /**
    * Sets the prototype of the provided object to the provided value
    * and returns the object.
@@ -594,30 +488,18 @@ export const {
 } = (() => {
   const createObject = Object;
   const {
-    assign,
     create,
-    defineProperty,
     defineProperties,
-    entries,
-    freeze,
-    fromEntries,
-    getOwnPropertyDescriptor,
-    getOwnPropertyDescriptors,
-    getOwnPropertyNames,
-    getOwnPropertySymbols,
     getPrototypeOf,
-    hasOwn,
-    isExtensible,
     isFrozen,
     isSealed,
-    keys,
-    preventExtensions,
-    seal,
     setPrototypeOf,
-    values,
   } = Object;
   const { [ITERATOR]: arrayIterator } = Array.prototype;
-  const arrayIteratorNext = getPrototypeOf([][ITERATOR]()).next;
+  const { next: arrayIteratorNext } = getPrototypeOf([][ITERATOR]());
+  const {
+    next: generatorIteratorNext,
+  } = getPrototypeOf(function* () {}.prototype);
   const splatIterablePrototype = {
     [ITERATOR]() {
       return {
@@ -631,35 +513,83 @@ export const {
   };
   const splatIterable = ($) =>
     create(splatIterablePrototype, { args: { value: $ } });
+  const propertyDescriptorEntryIterablePrototype = {
+    [ITERATOR]() {
+      return {
+        next: bind(generatorIteratorNext, this.generator(), []),
+      };
+    },
+  };
+  const propertyDescriptorEntryIterable = ($) =>
+    create(propertyDescriptorEntryIterablePrototype, {
+      generator: { value: $ },
+    });
 
   return {
-    defineOwnProperty: (O, P, Attributes) =>
-      defineProperty(O, P, Attributes),
     defineOwnProperties: (O, ...sources) => {
       for (const source of splatIterable(sources)) {
         defineProperties(O, source);
       }
       return O;
     },
-    freeze: (O) => freeze(O),
-    getOwnPropertyDescriptor: (O, P) => getOwnPropertyDescriptor(O, P),
-    getOwnPropertyDescriptors: (O) => getOwnPropertyDescriptors(O),
-    getOwnPropertyStrings: (O) => getOwnPropertyNames(O),
-    getOwnPropertySymbols: (O) => getOwnPropertySymbols(O),
-    getPrototype: (O) => getPrototypeOf(O),
-    hasOwnProperty: (O, P) => hasOwn(O, P),
-    isExtensibleObject: (O) => isExtensible(O),
+    frozenCopy: (O, constructor = O?.constructor) => {
+      if (O == null) {
+        // O is null or undefined.
+        throw new TypeError(
+          "Piscēs: Cannot copy properties of null or undefined.",
+        );
+      } else {
+        // O is not null or undefined.
+        //
+        // (If not provided, the constructor will be the value of
+        // getting the `.constructor` property of O.)
+        const species = constructor?.[SPECIES] ?? constructor;
+        return preventExtensions(
+          objectCreate(
+            species == null || !("prototype" in species)
+              ? null
+              : species.prototype,
+            objectFromEntries(
+              propertyDescriptorEntryIterable(function* () {
+                const ownPropertyKeys = getOwnPropertyKeys(O);
+                for (
+                  let i = 0;
+                  i < ownPropertyKeys.length;
+                  ++i
+                ) {
+                  const P = ownPropertyKeys[i];
+                  const Desc = getOwnPropertyDescriptor(O, P);
+                  if (Desc.enumerable) {
+                    // P is an enumerable property.
+                    yield [
+                      P,
+                      "get" in Desc || "set" in Desc
+                        ? {
+                          configurable: false,
+                          enumerable: true,
+                          get: Desc.get,
+                          set: Desc.set,
+                        }
+                        : {
+                          configurable: false,
+                          enumerable: true,
+                          value: Desc.value,
+                          writable: false,
+                        },
+                    ];
+                  } else {
+                    // P is not an enumerable property.
+                    /* do nothing */
+                  }
+                }
+              }),
+            ),
+          ),
+        );
+      }
+    },
     isUnfrozenObject: (O) => !isFrozen(O),
     isUnsealedObject: (O) => !isSealed(O),
-    namedEntries: (O) => entries(O),
-    namedKeys: (O) => keys(O),
-    namedValues: (O) => values(O),
-    objectCreate: (O, Properties) => create(O, Properties),
-    objectFromEntries: (iterable) => fromEntries(iterable),
-    preventExtensions: (O) => preventExtensions(O),
-    seal: (O) => seal(O),
-    setPropertyValues: (target, source, ...sources) =>
-      assign(target, source, ...splatIterable(sources)),
     setPrototype: (O, proto) => {
       const obj = toObject(O);
       if (O === obj) {
@@ -778,105 +708,14 @@ export const {
   };
 })();
 
-export const {
-  /**
-   * Returns a new frozen shallow copy of the enumerable own properties
-   * of the provided object, according to the following rules :—
-   *
-   * - For data properties, create a nonconfigurable, nonwritable
-   *   property with the same value.
-   *
-   * - For accessor properties, create a nonconfigurable accessor
-   *   property with the same getter *and* setter.
-   *
-   * The prototype for the resulting object will be taken from the
-   * `.prototype` property of the provided constructor, or the
-   * `.prototype` of the `.constructor` of the provided object if the
-   * provided constructor is undefined. If the used constructor has a
-   * nonnullish `.[Symbol.species]`, that will be used instead. If the
-   * used constructor or species is nullish or does not have a
-   * `.prototype` property, the prototype is set to null.
-   *
-   * ※ The prototype of the provided object itself is ignored.
-   */
-  frozenCopy,
-} = (() => {
-  const {
-    next: generatorIteratorNext,
-  } = getPrototype(function* () {}.prototype);
-  const propertyDescriptorEntryIterablePrototype = {
-    [ITERATOR]() {
-      return {
-        next: bind(generatorIteratorNext, this.generator(), []),
-      };
-    },
-  };
-  return {
-    frozenCopy: (O, constructor = O?.constructor) => {
-      if (O == null) {
-        // O is null or undefined.
-        throw new TypeError(
-          "Piscēs: Cannot copy properties of null or undefined.",
-        );
-      } else {
-        // O is not null or undefined.
-        //
-        // (If not provided, the constructor will be the value of
-        // getting the `.constructor` property of O.)
-        const species = constructor?.[SPECIES] ?? constructor;
-        return preventExtensions(
-          objectCreate(
-            species == null || !("prototype" in species)
-              ? null
-              : species.prototype,
-            objectFromEntries(
-              objectCreate(
-                propertyDescriptorEntryIterablePrototype,
-                {
-                  generator: {
-                    value: function* () {
-                      const ownPropertyKeys = getOwnPropertyKeys(O);
-                      for (
-                        let i = 0;
-                        i < ownPropertyKeys.length;
-                        ++i
-                      ) {
-                        const P = ownPropertyKeys[i];
-                        const Desc = getOwnPropertyDescriptor(O, P);
-                        if (Desc.enumerable) {
-                          // P is an enumerable property.
-                          yield [
-                            P,
-                            "get" in Desc || "set" in Desc
-                              ? {
-                                configurable: false,
-                                enumerable: true,
-                                get: Desc.get,
-                                set: Desc.set,
-                              }
-                              : {
-                                configurable: false,
-                                enumerable: true,
-                                value: Desc.value,
-                                writable: false,
-                              },
-                          ];
-                        } else {
-                          // P is not an enumerable property.
-                          /* do nothing */
-                        }
-                      }
-                    },
-                  },
-                },
-              ),
-            ),
-          ),
-        );
-      }
-    },
-  };
-})();
+/**
+ * Marks the provided object as non·extensible and marks all its
+ * properties as nonconfigurable and (if data properties) nonwritable,
+ * and returns the object.
+ *
+ * ※ This is effectively an alias for `Object.freeze`.
+ */
+export const freeze = createArrowFunction(Object.freeze);
 
 /**
  * Returns the function on the provided value at the provided property
@@ -896,6 +735,165 @@ export const getMethod = (V, P) => {
   }
 };
 
+/**
+ * Returns the property descriptor for the own property with the
+ * provided property key on the provided object, or null if none
+ * exists.
+ *
+ * ※ This is effectively an alias for
+ * `Object.getOwnPropertyDescriptor`.
+ */
+export const getOwnPropertyDescriptor = createArrowFunction(
+  Object.getOwnPropertyDescriptor,
+);
+
+/**
+ * Returns the property descriptors for the own properties on the
+ * provided object.
+ *
+ * ※ This is effectively an alias for
+ * `Object.getOwnPropertyDescriptors`.
+ */
+export const getOwnPropertyDescriptors = createArrowFunction(
+  Object.getOwnPropertyDescriptors,
+);
+
+/**
+ * Returns an array of string‐valued own property keys on the
+ * provided object.
+ *
+ * ☡ This includes both enumerable and non·enumerable properties.
+ *
+ * ※ This is effectively an alias for `Object.getOwnPropertyNames`.
+ */
+export const getOwnPropertyStrings = createArrowFunction(
+  Object.getOwnPropertyNames,
+  { name: "getOwnPropertyStrings" },
+);
+
+/**
+ * Returns an array of symbol‐valued own property keys on the
+ * provided object.
+ *
+ * ☡ This includes both enumerable and non·enumerable properties.
+ *
+ * ※ This is effectively an alias for
+ * `Object.getOwnPropertySymbols`.
+ */
+export const getOwnPropertySymbols = createArrowFunction(
+  Object.getOwnPropertySymbols,
+);
+
+/**
+ * Returns the prototype of the provided object.
+ *
+ * ※ This is effectively an alias for `Object.getPrototypeOf`.
+ */
+export const getPrototype = createArrowFunction(
+  Object.getPrototypeOf,
+  { name: "getPrototype" },
+);
+
+/**
+ * Returns whether the provided object has an own property with the
+ * provided property key.
+ *
+ * ※ This is effectively an alias for `Object.hasOwn`.
+ */
+export const hasOwnProperty = createArrowFunction(Object.hasOwn, {
+  name: "hasOwnProperty",
+});
+
+/**
+ * Returns whether the provided object is extensible.
+ *
+ * ※ This function returns false for nonobjects.
+ *
+ * ※ This is effectively an alias for `Object.isExtensible`.
+ */
+export const isExtensibleObject = createArrowFunction(
+  Object.isExtensible,
+  { name: "isExtensibleObject" },
+);
+
+/**
+ * Returns an array of key~value pairs for the enumerable,
+ * string‐valued property keys on the provided object.
+ *
+ * ※ This is effectively an alias for `Object.entries`.
+ */
+export const namedEntries = createArrowFunction(Object.entries, {
+  name: "namedEntries",
+});
+
+/**
+ * Returns an array of the enumerable, string‐valued property keys on
+ * the provided object.
+ *
+ * ※ This is effectively an alias for `Object.keys`.
+ */
+export const namedKeys = createArrowFunction(Object.keys, {
+  name: "namedKeys",
+});
+
+/**
+ * Returns an array of property values for the enumerable,
+ * string‐valued property keys on the provided object.
+ *
+ * ※ This is effectively an alias for `Object.values`.
+ */
+export const namedValues = createArrowFunction(Object.values, {
+  name: "namedValues",
+});
+
+/**
+ * Returns a new object with the provided prototype and property
+ * descriptors.
+ *
+ * ※ This is effectively an alias for `Object.create`.
+ */
+export const objectCreate = createArrowFunction(Object.create, {
+  name: "objectCreate",
+});
+
+/**
+ * Returns a new object with the provided property keys and values.
+ *
+ * ※ This is effectively an alias for `Object.fromEntries`.
+ */
+export const objectFromEntries = createArrowFunction(
+  Object.fromEntries,
+  { name: "objectFromEntries" },
+);
+
+/**
+ * Marks the provided object as non·extensible, and returns the
+ * object.
+ *
+ * ※ This is effectively an alias for `Object.preventExtensions`.
+ */
+export const preventExtensions = createArrowFunction(
+  Object.preventExtensions,
+);
+
+/**
+ * Marks the provided object as non·extensible and marks all its
+ * properties as nonconfigurable, and returns the object.
+ *
+ * ※ This is effectively an alias for `Object.seal`.
+ */
+export const seal = createArrowFunction(Object.seal);
+
+/**
+ * Sets the values of the enumerable own properties of the provided
+ * additional objects on the provided object.
+ *
+ * ※ This is effectively an alias for `Object.assign`.
+ */
+export const setPropertyValues = createArrowFunction(Object.assign, {
+  name: "setPropertyValues",
+});
+
 /**
  * Returns the property key (symbol or string) corresponding to the
  * provided value.
This page took 0.035307 seconds and 4 git commands to generate.