vek-engine
Version:
Efficient WebAssembly-based vector math engine for JavaScript/TypeScript
332 lines (331 loc) • 14.3 kB
JavaScript
export async function instantiate(module, imports = {}) {
const adaptedImports = {
env: Object.assign(Object.create(globalThis), imports.env || {}, {
abort(message, fileName, lineNumber, columnNumber) {
// ~lib/builtins/abort(~lib/string/String | null?, ~lib/string/String | null?, u32?, u32?) => void
message = __liftString(message >>> 0);
fileName = __liftString(fileName >>> 0);
lineNumber = lineNumber >>> 0;
columnNumber = columnNumber >>> 0;
(() => {
// @external.js
throw Error(`${message} in ${fileName}:${lineNumber}:${columnNumber}`);
})();
},
}),
};
const { exports } = await WebAssembly.instantiate(module, adaptedImports);
const memory = exports.memory || imports.env.memory;
const adaptedExports = Object.setPrototypeOf({
vectorCreate(dimensions, elementByteSize) {
// wasm/src/vector/vectorCreate(u32, u8) => wasm/src/vector/Vector
return __liftInternref(exports.vectorCreate(dimensions, elementByteSize) >>> 0);
},
vectorInstanceArithmeticMean(vector) {
// wasm/src/vector/vectorInstanceArithmeticMean(wasm/src/vector/Vector) => f64
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceArithmeticMean(vector);
},
vectorInstanceFill(vector, value) {
// wasm/src/vector/vectorInstanceFill(wasm/src/vector/Vector, f64) => void
vector = __lowerInternref(vector) || __notnull();
exports.vectorInstanceFill(vector, value);
},
vectorInstanceGeometricMean(vector) {
// wasm/src/vector/vectorInstanceGeometricMean(wasm/src/vector/Vector) => f64
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceGeometricMean(vector);
},
vectorInstanceGetDimensions(vector) {
// wasm/src/vector/vectorInstanceGetDimensions(wasm/src/vector/Vector) => u32
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceGetDimensions(vector) >>> 0;
},
vectorInstanceGetElementByteSize(vector) {
// wasm/src/vector/vectorInstanceGetElementByteSize(wasm/src/vector/Vector) => u8
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceGetElementByteSize(vector);
},
vectorInstanceGetIs64Bit(vector) {
// wasm/src/vector/vectorInstanceGetIs64Bit(wasm/src/vector/Vector) => bool
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceGetIs64Bit(vector) != 0;
},
vectorInstanceGetMaxIndex(vector) {
// wasm/src/vector/vectorInstanceGetMaxIndex(wasm/src/vector/Vector) => u32
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceGetMaxIndex(vector) >>> 0;
},
vectorInstanceGetValue(vector, index) {
// wasm/src/vector/vectorInstanceGetValue(wasm/src/vector/Vector, u32) => f64
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceGetValue(vector, index);
},
vectorInstanceIndexOfMax(vector) {
// wasm/src/vector/vectorInstanceIndexOfMax(wasm/src/vector/Vector) => u32
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceIndexOfMax(vector) >>> 0;
},
vectorInstanceIndexOfMin(vector) {
// wasm/src/vector/vectorInstanceIndexOfMin(wasm/src/vector/Vector) => u32
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceIndexOfMin(vector) >>> 0;
},
vectorInstanceInfinityNorm(vector) {
// wasm/src/vector/vectorInstanceInfinityNorm(wasm/src/vector/Vector) => f64
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceInfinityNorm(vector);
},
vectorInstanceMax(vector) {
// wasm/src/vector/vectorInstanceMax(wasm/src/vector/Vector) => f64
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceMax(vector);
},
vectorInstanceMin(vector) {
// wasm/src/vector/vectorInstanceMin(wasm/src/vector/Vector) => f64
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceMin(vector);
},
vectorInstanceMode(vector) {
// wasm/src/vector/vectorInstanceMode(wasm/src/vector/Vector) => ~lib/typedarray/Float64Array
vector = __lowerInternref(vector) || __notnull();
return __liftTypedArray(Float64Array, exports.vectorInstanceMode(vector) >>> 0);
},
vectorInstanceNeg(vector, resultVector) {
// wasm/src/vector/vectorInstanceNeg(wasm/src/vector/Vector, wasm/src/vector/Vector) => void
vector = __retain(__lowerInternref(vector) || __notnull());
resultVector = __lowerInternref(resultVector) || __notnull();
try {
exports.vectorInstanceNeg(vector, resultVector);
} finally {
__release(vector);
}
},
vectorInstancePNorm(vector, p) {
// wasm/src/vector/vectorInstancePNorm(wasm/src/vector/Vector, f32) => f64
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstancePNorm(vector, p);
},
vectorInstanceSetValue(vector, index, value) {
// wasm/src/vector/vectorInstanceSetValue(wasm/src/vector/Vector, u32, f64) => bool
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceSetValue(vector, index, value) != 0;
},
vectorInstanceSum(vector) {
// wasm/src/vector/vectorInstanceSum(wasm/src/vector/Vector) => f64
vector = __lowerInternref(vector) || __notnull();
return exports.vectorInstanceSum(vector);
},
vectorInstanceToBuffer(vector) {
// wasm/src/vector/vectorInstanceToBuffer(wasm/src/vector/Vector) => ~lib/arraybuffer/ArrayBuffer
vector = __lowerInternref(vector) || __notnull();
return __liftBuffer(exports.vectorInstanceToBuffer(vector) >>> 0);
},
vectorStaticAdd(aVector, bVector, resultVector) {
// wasm/src/vector/vectorStaticAdd(wasm/src/vector/Vector, wasm/src/vector/Vector, wasm/src/vector/Vector) => void
aVector = __retain(__lowerInternref(aVector) || __notnull());
bVector = __retain(__lowerInternref(bVector) || __notnull());
resultVector = __lowerInternref(resultVector) || __notnull();
try {
exports.vectorStaticAdd(aVector, bVector, resultVector);
} finally {
__release(aVector);
__release(bVector);
}
},
vectorStaticCmp(aVector, bVector) {
// wasm/src/vector/vectorStaticCmp(wasm/src/vector/Vector, wasm/src/vector/Vector) => ~lib/arraybuffer/ArrayBuffer
aVector = __retain(__lowerInternref(aVector) || __notnull());
bVector = __lowerInternref(bVector) || __notnull();
try {
return __liftBuffer(exports.vectorStaticCmp(aVector, bVector) >>> 0);
} finally {
__release(aVector);
}
},
vectorStaticCosineSimilarity(aVector, bVector) {
// wasm/src/vector/vectorStaticCosineSimilarity(wasm/src/vector/Vector, wasm/src/vector/Vector) => f64
aVector = __retain(__lowerInternref(aVector) || __notnull());
bVector = __lowerInternref(bVector) || __notnull();
try {
return exports.vectorStaticCosineSimilarity(aVector, bVector);
} finally {
__release(aVector);
}
},
vectorStaticDiv(aVector, bVector, resultVector) {
// wasm/src/vector/vectorStaticDiv(wasm/src/vector/Vector, wasm/src/vector/Vector, wasm/src/vector/Vector) => void
aVector = __retain(__lowerInternref(aVector) || __notnull());
bVector = __retain(__lowerInternref(bVector) || __notnull());
resultVector = __lowerInternref(resultVector) || __notnull();
try {
exports.vectorStaticDiv(aVector, bVector, resultVector);
} finally {
__release(aVector);
__release(bVector);
}
},
vectorStaticDot(aVector, bVector) {
// wasm/src/vector/vectorStaticDot(wasm/src/vector/Vector, wasm/src/vector/Vector) => f64
aVector = __retain(__lowerInternref(aVector) || __notnull());
bVector = __lowerInternref(bVector) || __notnull();
try {
return exports.vectorStaticDot(aVector, bVector);
} finally {
__release(aVector);
}
},
vectorStaticFromBuffer(buffer) {
// wasm/src/vector/vectorStaticFromBuffer(~lib/arraybuffer/ArrayBuffer) => wasm/src/vector/Vector
buffer = __lowerBuffer(buffer) || __notnull();
return __liftInternref(exports.vectorStaticFromBuffer(buffer) >>> 0);
},
vectorStaticMod(aVector, bVector, resultVector) {
// wasm/src/vector/vectorStaticMod(wasm/src/vector/Vector, wasm/src/vector/Vector, wasm/src/vector/Vector) => void
aVector = __retain(__lowerInternref(aVector) || __notnull());
bVector = __retain(__lowerInternref(bVector) || __notnull());
resultVector = __lowerInternref(resultVector) || __notnull();
try {
exports.vectorStaticMod(aVector, bVector, resultVector);
} finally {
__release(aVector);
__release(bVector);
}
},
vectorStaticMul(aVector, bVector, resultVector) {
// wasm/src/vector/vectorStaticMul(wasm/src/vector/Vector, wasm/src/vector/Vector, wasm/src/vector/Vector) => void
aVector = __retain(__lowerInternref(aVector) || __notnull());
bVector = __retain(__lowerInternref(bVector) || __notnull());
resultVector = __lowerInternref(resultVector) || __notnull();
try {
exports.vectorStaticMul(aVector, bVector, resultVector);
} finally {
__release(aVector);
__release(bVector);
}
},
vectorStaticOnes(dimensions, elementByteSize) {
// wasm/src/vector/vectorStaticOnes(u32, u8) => wasm/src/vector/Vector
return __liftInternref(exports.vectorStaticOnes(dimensions, elementByteSize) >>> 0);
},
vectorStaticSub(aVector, bVector, resultVector) {
// wasm/src/vector/vectorStaticSub(wasm/src/vector/Vector, wasm/src/vector/Vector, wasm/src/vector/Vector) => void
aVector = __retain(__lowerInternref(aVector) || __notnull());
bVector = __retain(__lowerInternref(bVector) || __notnull());
resultVector = __lowerInternref(resultVector) || __notnull();
try {
exports.vectorStaticSub(aVector, bVector, resultVector);
} finally {
__release(aVector);
__release(bVector);
}
},
vectorIteratorCreate(vector) {
// wasm/src/vector-iterator/vectorIteratorCreate(wasm/src/vector/Vector) => wasm/src/vector-iterator/VectorIterator
vector = __lowerInternref(vector) || __notnull();
return __liftInternref(exports.vectorIteratorCreate(vector) >>> 0);
},
vectorIteratorInstanceNext(iterator) {
// wasm/src/vector-iterator/vectorIteratorInstanceNext(wasm/src/vector-iterator/VectorIterator) => wasm/src/vector-iterator/VectorIteratorNext
iterator = __lowerInternref(iterator) || __notnull();
return __liftRecord19(exports.vectorIteratorInstanceNext(iterator) >>> 0);
},
}, exports);
function __liftRecord19(pointer) {
// wasm/src/vector-iterator/VectorIteratorNext
// Hint: Opt-out from lifting as a record by providing an empty constructor
if (!pointer) return null;
return {
isDone: __getU8(pointer + 0) != 0,
value: __getF64(pointer + 8),
};
}
function __liftBuffer(pointer) {
if (!pointer) return null;
return memory.buffer.slice(pointer, pointer + new Uint32Array(memory.buffer)[pointer - 4 >>> 2]);
}
function __lowerBuffer(value) {
if (value == null) return 0;
const pointer = exports.__new(value.byteLength, 1) >>> 0;
new Uint8Array(memory.buffer).set(new Uint8Array(value), pointer);
return pointer;
}
function __liftString(pointer) {
if (!pointer) return null;
const
end = pointer + new Uint32Array(memory.buffer)[pointer - 4 >>> 2] >>> 1,
memoryU16 = new Uint16Array(memory.buffer);
let
start = pointer >>> 1,
string = "";
while (end - start > 1024) string += String.fromCharCode(...memoryU16.subarray(start, start += 1024));
return string + String.fromCharCode(...memoryU16.subarray(start, end));
}
function __liftTypedArray(constructor, pointer) {
if (!pointer) return null;
return new constructor(
memory.buffer,
__getU32(pointer + 4),
__dataview.getUint32(pointer + 8, true) / constructor.BYTES_PER_ELEMENT
).slice();
}
class Internref extends Number {}
const registry = new FinalizationRegistry(__release);
function __liftInternref(pointer) {
if (!pointer) return null;
const sentinel = new Internref(__retain(pointer));
registry.register(sentinel, pointer);
return sentinel;
}
function __lowerInternref(value) {
if (value == null) return 0;
if (value instanceof Internref) return value.valueOf();
throw TypeError("internref expected");
}
const refcounts = new Map();
function __retain(pointer) {
if (pointer) {
const refcount = refcounts.get(pointer);
if (refcount) refcounts.set(pointer, refcount + 1);
else refcounts.set(exports.__pin(pointer), 1);
}
return pointer;
}
function __release(pointer) {
if (pointer) {
const refcount = refcounts.get(pointer);
if (refcount === 1) exports.__unpin(pointer), refcounts.delete(pointer);
else if (refcount) refcounts.set(pointer, refcount - 1);
else throw Error(`invalid refcount '${refcount}' for reference '${pointer}'`);
}
}
function __notnull() {
throw TypeError("value must not be null");
}
let __dataview = new DataView(memory.buffer);
function __getU8(pointer) {
try {
return __dataview.getUint8(pointer, true);
} catch {
__dataview = new DataView(memory.buffer);
return __dataview.getUint8(pointer, true);
}
}
function __getU32(pointer) {
try {
return __dataview.getUint32(pointer, true);
} catch {
__dataview = new DataView(memory.buffer);
return __dataview.getUint32(pointer, true);
}
}
function __getF64(pointer) {
try {
return __dataview.getFloat64(pointer, true);
} catch {
__dataview = new DataView(memory.buffer);
return __dataview.getFloat64(pointer, true);
}
}
return adaptedExports;
}