gpu.js
Version:
GPU Accelerated JavaScript
85 lines (82 loc) • 2.46 kB
JavaScript
const { utils } = require('./utils');
/**
* Makes kernels easier for mortals (including me)
* @param kernel
* @returns {function()}
*/
function kernelRunShortcut(kernel) {
let run = function() {
kernel.build.apply(kernel, arguments);
run = function() {
let result = kernel.run.apply(kernel, arguments);
if (kernel.switchingKernels) {
const reasons = kernel.resetSwitchingKernels();
const newKernel = kernel.onRequestSwitchKernel(reasons, arguments, kernel);
shortcut.kernel = kernel = newKernel;
result = newKernel.run.apply(newKernel, arguments);
}
if (kernel.renderKernels) {
return kernel.renderKernels();
} else if (kernel.renderOutput) {
return kernel.renderOutput();
} else {
return result;
}
};
return run.apply(kernel, arguments);
};
const shortcut = function() {
return run.apply(kernel, arguments);
};
/**
* Run kernel in async mode
* @returns {Promise<KernelOutput>}
*/
shortcut.exec = function() {
return new Promise((accept, reject) => {
try {
accept(run.apply(this, arguments));
} catch (e) {
reject(e);
}
});
};
shortcut.replaceKernel = function(replacementKernel) {
kernel = replacementKernel;
bindKernelToShortcut(kernel, shortcut);
};
bindKernelToShortcut(kernel, shortcut);
return shortcut;
}
function bindKernelToShortcut(kernel, shortcut) {
if (shortcut.kernel) {
shortcut.kernel = kernel;
return;
}
const properties = utils.allPropertiesOf(kernel);
for (let i = 0; i < properties.length; i++) {
const property = properties[i];
if (property[0] === '_' && property[1] === '_') continue;
if (typeof kernel[property] === 'function') {
if (property.substring(0, 3) === 'add' || property.substring(0, 3) === 'set') {
shortcut[property] = function() {
shortcut.kernel[property].apply(shortcut.kernel, arguments);
return shortcut;
};
} else {
shortcut[property] = function() {
return shortcut.kernel[property].apply(shortcut.kernel, arguments);
};
}
} else {
shortcut.__defineGetter__(property, () => shortcut.kernel[property]);
shortcut.__defineSetter__(property, (value) => {
shortcut.kernel[property] = value;
});
}
}
shortcut.kernel = kernel;
}
module.exports = {
kernelRunShortcut
};