It is possible to provide indexing like Buffer has by using Proxy. Here's an example.
For more information, see Proxy and Reflect on MDN.
class BufferCollection {
// Declare the index operator.
[offset: number]: number
// ...
static from(
values: BufferFromTypes | Buffer | BufferCollection,
byteOffset?: number,
length?: number,
): BufferCollection {
const buf = new BufferCollection()
if (values instanceof BufferCollection) {
buf.push(values.toBuffer())
} else if (values instanceof Buffer) {
buf.push(values)
} else if (
values instanceof ArrayBuffer ||
values instanceof SharedArrayBuffer
) {
buf.push(Buffer.from(values, byteOffset, length))
} else {
buf.push(Buffer.from(values as any))
}
// Return a Proxy that traps the get and set index operators.
return new Proxy(buf, {
get(target, key) {
// Ensure the key is a number.
const offset = Number(key)
if (!isNaN(offset)) {
return target.get(offset)
}
// If key is not a number, default to the normal getter.
return Reflect.get(target, key) as number
},
set(target, key, value): boolean {
// Ensure the key is a number.
const offset = Number(key)
if (!isNaN(offset)) {
target.set(offset, value)
// Return true to indicate success.
return true
}
// If key is not a number, default to the normal setter.
return Reflect.set(target, key, value)
},
})
}
// ...
}
It is possible to provide indexing like
Bufferhas by usingProxy. Here's an example.For more information, see Proxy and Reflect on MDN.