summaryrefslogtreecommitdiff
path: root/packages/webapi/src/lib/RelativeIndexingMethod.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/webapi/src/lib/RelativeIndexingMethod.ts')
-rw-r--r--packages/webapi/src/lib/RelativeIndexingMethod.ts32
1 files changed, 32 insertions, 0 deletions
diff --git a/packages/webapi/src/lib/RelativeIndexingMethod.ts b/packages/webapi/src/lib/RelativeIndexingMethod.ts
new file mode 100644
index 000000000..56627dfc3
--- /dev/null
+++ b/packages/webapi/src/lib/RelativeIndexingMethod.ts
@@ -0,0 +1,32 @@
+type TypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array | BigInt64Array | BigUint64Array
+
+export const at = {
+ at<T extends Array<any> | string | TypedArray>(this: T, index: number) {
+ index = Math.trunc(index) || 0
+
+ if (index < 0) index += this.length;
+
+ if (index < 0 || index >= this.length) return undefined;
+
+ return this[index];
+ }
+}.at
+
+export const initRelativeIndexingMethod = (target: any, exclude: Set<string>) => {
+ if (exclude.has('at')) return
+
+ const Classes = []
+
+ if (!exclude.has('TypedArray')) Classes.push(Object.getPrototypeOf(target.Int8Array || globalThis.Int8Array))
+ if (!exclude.has('Array')) Classes.push(target.Array || globalThis.Array)
+ if (!exclude.has('String')) Classes.push(target.String || globalThis.String)
+
+ for (const Class of Classes) {
+ if (!Class.prototype.at) Object.defineProperty(Class.prototype, 'at', {
+ value: at,
+ writable: true,
+ enumerable: false,
+ configurable: true
+ })
+ }
+}