]> Lady’s Gitweb - Pisces/commitdiff
Refactor some functions in function.js to simplify
authorLady <redacted>
Wed, 22 Nov 2023 02:43:10 +0000 (21:43 -0500)
committerLady <redacted>
Thu, 23 Nov 2023 02:04:55 +0000 (21:04 -0500)
function.js

index d58d2905cfbc5df6862645ce39764375b4bef9bc..d02fe6e85eb6a8ec2a7137dd221ecb227d7640c1 100644 (file)
@@ -58,9 +58,7 @@ export const {
     bind: functionBind,
     call: functionCall,
   } = functionPrototype;
-  const callBind = Reflect.apply(functionBind, functionCall, [
-    functionBind,
-  ]);
+  const { apply: reflectApply } = Reflect;
   const {
     create: objectCreate,
     defineProperty: defineOwnProperty,
@@ -69,6 +67,9 @@ export const {
     getPrototypeOf: getPrototype,
     setPrototypeOf: setPrototype,
   } = Object;
+  const callBind = reflectApply(functionBind, functionCall, [
+    functionBind,
+  ]);
   const { [ITERATOR]: arrayIterator } = Array.prototype;
   const {
     next: arrayIteratorNext,
@@ -112,12 +113,9 @@ export const {
     } else {
       // Properties were provided; apply them.
       const { length, name, prototype } = override;
-      if (
-        !isConstructor($) || !hasOwnProperty($, "prototype") ||
-        prototype === undefined
-      ) {
-        // The provided function is not a constructor, has no
-        // `.prototype`, or no prototype value was provided.
+      if (!hasOwnProperty($, "prototype") || prototype === undefined) {
+        // The provided function has no `.prototype` or no prototype
+        // value was provided.
         //
         // Do not modify the prototype property of the provided
         // function.
@@ -156,11 +154,7 @@ export const {
     createArrowFunction: ($, propertyOverride = undefined) =>
       applyProperties(
         applyBaseFunction(
-          (...$s) =>
-            $(...objectCreate(
-              argumentIterablePrototype,
-              { args: { value: $s } },
-            )),
+          (...$s) => reflectApply($, undefined, $s),
           $,
         ),
         propertyOverride,
@@ -174,70 +168,41 @@ export const {
               { args: { value: $s } },
             )[ITERATOR]();
             const { value: thisValue } = iterator.next();
-            return call($, thisValue, [...iterator]);
+            return reflectApply($, thisValue, [...iterator]);
           },
           $,
           1,
         ),
         propertyOverride,
       ),
-    createIllegalConstructor: ($, propertyOverride = undefined) => {
-      const constructor = applyProperties(
-        applyBaseFunction(
-          function () {
-            throw new TypeError("Illegal constructor");
-          },
-          $,
+    createIllegalConstructor: ($, propertyOverride = undefined) =>
+      defineOwnProperty(
+        applyProperties(
+          applyBaseFunction(
+            function () {
+              throw new TypeError("Illegal constructor");
+            },
+            $,
+          ),
+          propertyOverride,
         ),
-        propertyOverride,
-      );
-      return defineOwnProperty(constructor, "prototype", {
-        writable: false,
-      });
-    },
-  };
-})();
-
-export const {
-  /**
-   * Calls the provided function with the provided this value and
-   * arguments list.
-   *
-   * ☡ This is effectively an alias for `Reflect.apply`—the arguments
-   * must be passed as an arraylike.
-   */
-  call,
-
-  /**
-   * Constructs the provided function with the provided arguments list
-   * and new target.
-   *
-   * ☡ This is effectively an alias for `Reflect.construct`—the
-   * arguments must be passed as an arraylike.
-   */
-  construct,
-
-  /** Returns whether the provided value is a constructor. */
-  isConstructor,
-} = (() => {
-  const { apply, construct } = Reflect;
-  return {
-    call: (target, thisArgument, argumentsList) =>
-      apply(target, thisArgument, argumentsList),
-    construct: (target, argumentsList, ...args) =>
-      args.length > 0
-        ? construct(target, argumentsList, args[0])
-        : construct(target, argumentsList),
-    isConstructor: ($) =>
-      completesNormally(() =>
-        // Try constructing a new object with the provided value as its
-        // `new.target`. This will throw if the provided value is not a
-        // constructor.
-        construct(function () {}, [], $)
+        "prototype",
+        { writable: false },
       ),
   };
 })();
 
+/**
+ * Calls the provided function with the provided this value and
+ * arguments list.
+ *
+ * ☡ This is effectively an alias for `Reflect.apply`—the arguments
+ * must be passed as an arraylike.
+ */
+export const call = createArrowFunction(Reflect.apply, {
+  name: "call",
+});
+
 /**
  * Returns whether calling the provided function with no `this` value
  * or arguments completes normally; that is, does not throw an error.
@@ -264,6 +229,15 @@ export const completesNormally = ($) => {
   }
 };
 
+/**
+ * Constructs the provided function with the provided arguments list
+ * and new target.
+ *
+ * ☡ This is effectively an alias for `Reflect.construct`—the
+ * arguments must be passed as an arraylike.
+ */
+export const construct = createArrowFunction(Reflect.construct);
+
 /**
  * Returns the provided value.
  *
@@ -279,6 +253,15 @@ export const identity = function ($) {
 /** Returns whether the provided value is callable. */
 export const isCallable = ($) => typeof $ === "function";
 
+/** Returns whether the provided value is a constructor. */
+export const isConstructor = ($) =>
+  completesNormally(() =>
+    // Try constructing a new object with the provided value as its
+    // `new.target`. This will throw if the provided value is not a
+    // constructor.
+    construct(function () {}, [], $)
+  );
+
 /**
  * Returns whether the provided object inherits from the prototype of
  * the provided function.
This page took 0.026204 seconds and 4 git commands to generate.