JSFiddle - React, Tailwind, and code Playground

by Josh Pullen

JavaScript

class Vector {
	constructor(...entries) {
  	this.entries = Object.freeze(entries);
    Object.freeze(this);
  }
  
  add(b) {
  	return Vector.add(this, b);
  }
  
  scale(a) {
  	return Vector.scale(this, a);
  }
  
  static add(a, b) {
  	if (a.entries.length !== b.entries.length) throw new Error();
    
    let newEntries = [];
    for (let i = 0; i < a.entries.length; i++) {
    	newEntries[i] = a.entries[i] + b.entries[i];
    }
  	return new Vector(...newEntries);
  }
  
  static scale(vec, scalar) {
  	return new Vector(...vec.entries.map(e => e * scalar));
  }
}

const pos = new Vector(1, 2, 3);
const vel = new Vector(0, -1, 2);

console.log(pos.add(vel.scale(2)));
console.log(add(pos, scale(vel, 2)));
console.log(m`${pos} + 2 * ${vel}`);
console.log(m(`pos + 2 * vel`, { pos, vel }));

console.log(m`d/dx(x * ${pos}) - ${pos}`);