Toy Quantum Circuit Inspector
https://github.com/Strilanc/Quantum-Circuit-Inspector
HTML
<canvas id="drawCanvas" width="1200px" height="600px" style="border:1px solid #000000;"></canvas>
JavaScript
window.onerror = function myErrorHandler(errorMsg, url, lineNumber) {
alert("Error! (Try clicking around the blankness to recover...)\n\n" + errorMsg + "\n\nURL: " + url + "\nLine: " + lineNumber);
return false;
};
/**
* Checks a precondition, throwing an exception containing the given message in the case of failure.
*
* @param {!boolean|*} expression
* @param {=string} message
*/
var need = function(expression, message) {
if (expression !== true) {
throw "Precondition failed: " + (message || "(no message provided)");
}
};
/**
* Forced cast from nullable to non-nullable, throwing an exception on failure.
*
* @param {?T} v
* @returns {!T}
*
* @template T
*/
var notNull = function(v) {
need(v !== null);
//noinspection JSValidateTypes
return v;
};
/**
* Runs an aggregating function over an array, returning the accumulated value at each point (including the seed).
*
* @param {!Array.<T>} items
* @param {S} seed
* @param {!function(S, T) : S} aggregator
*
* @template T, S
*
* @returns {!Array.<S>}
*/
var scan = function(items, seed, aggregator) {
var result = [];
result.push(seed);
var state = seed;
for (var i = 0; i < items.length; i++) {
state = aggregator(state, items[i]);
result.push(state);
}
return result;
};
/**
* Mutates the given array, pushing items at or past the given index ahead and placing the given item in the new space.
*
* @param {!Array<T>} array
* @param {T} item
* @param {!int} index
*
* @template T
*/
var insertAt = function(array, item, index) {
need(index >= 0 && index <= array.length);
array.splice(index, 0, item);
};
/**
* Returns a copy of the given array, except the item at the given index is swapped out for the given item.
*
* @param {!Array<T>} array
* @param {T} item
* @param {!int} index
*
* @returns {!Array<T>}
*
* @template T
*/
var withItemReplacedAt = function(array, item, index) {
need(index >= 0 &&...