Skip to content

Commit

Permalink
feat(vector): factory functions for correct types
Browse files Browse the repository at this point in the history
  • Loading branch information
MrTelanie committed Apr 18, 2019
1 parent 0f978da commit dedcc9a
Show file tree
Hide file tree
Showing 4 changed files with 130 additions and 97 deletions.
2 changes: 1 addition & 1 deletion examples/example.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// @ts-nocheck
import { calc, Vector, Victor } from '../src';
import debug from '../src/debug';
/* eslint-disable no-console */

// create vector by numbers
const pos = new Vector(5, 6, 7);
const dir = new Vector(1, 0, 0);
Expand Down
5 changes: 0 additions & 5 deletions src/operator.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,6 @@ function maxVector(v1, v2) {
return v2;
}

/**
* @param {() => number} alg
* @param {{ x: number, y: number, z: number } | { x: number, y: number }=} result
* @return {{ x: number, y: number, z: number } | { x: number, y: number } | number}
*/
export function operatorCalc(alg, result) {
if (typeof alg !== 'function') {
throw new Error('no function assigned');
Expand Down
150 changes: 91 additions & 59 deletions src/vector.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
// @ts-nocheck
import {
cachedMethod,
cachedGetter,
Expand All @@ -19,14 +20,15 @@ function square(val) {
}

/**
* @extends {number}
* @typedef {AVector & number} AVectorType
* @abstract
*/
class AVector {
/**
*
* @param {number} x
* @param {number} y
* @param {number} z
* @param {number | (() => number)} x
* @param {number} [y]
* @param {number} [z]
*/
constructor(x, y, z) {
if (typeof x === 'function') {
Expand All @@ -46,15 +48,15 @@ class AVector {
}

/**
* @returns {AVector}
* @returns {AVectorType}
*/
normalize() {
const { length } = this;
return new this.constructor(this.x / length, this.y / length, this.z / length);
}

/**
* @returns {AVector}
* @returns {AVectorType}
*/
norm() {
return this.normalize();
Expand All @@ -75,7 +77,7 @@ class AVector {
/**
*
* @param {AVector} v
* @returns {AVector}
* @returns {AVectorType}
*/
cross(v) {
return new this.constructor(
Expand All @@ -88,7 +90,7 @@ class AVector {
/**
*
* @param {AVector} v
* @returns {AVector}
* @returns {AVectorType}
*/
crossNormalize(v) {
const vec = this.cross(v);
Expand All @@ -102,7 +104,7 @@ class AVector {
/**
*
* @param {AVector} v
* @returns {AVector}
* @returns {AVectorType}
*/
cn(v) {
return this.crossNormalize(v);
Expand Down Expand Up @@ -240,6 +242,54 @@ class AVector {
get len() {
return this.length;
}

/**
*
* @returns {number}
*/
get x() {
return this[AXES][X];
}

/**
*
* @throws SetNotImplementedError
*/
set x(_) {
throw new Error('set x() not implemented');
}

/**
*
* @returns {number}
*/
get y() {
return this[AXES][Y];
}

/**
*
* @throws SetNotImplementedError
*/
set y(_) {
throw new Error('set y() not implemented');
}

/**
*
* @returns {number}
*/
get z() {
return this[AXES][Z];
}

/**
*
* @throws SetNotImplementedError
*/
set z(_) {
throw new Error('set z() not implemented');
}
}

cachedValueOf(AVector);
Expand All @@ -255,6 +305,9 @@ cachedMethod(AVector, 'toArray');
cachedGetter(AVector, 'length');
cachedGetter(AVector, 'lengthSq');

/**
* @typedef {Vector & number} VectorType
*/
export class Vector extends AVector {
/**
*
Expand Down Expand Up @@ -305,80 +358,59 @@ export class Vector extends AVector {
}

/**
* @param {() => number} alg
* @param {(vector: VectorType) => number} alg
* @returns {this}
*/
calc(alg) {
return operatorCalc(alg, this);
}

/**
*
* @returns {Vector}
* @returns {Vector & number}
*/
clone() {
return new Vector(this.x, this.y, this.z);
}
}

/**
* @typedef {Victor & number} VictorType
*/
export class Victor extends AVector {
/**
*
* @returns {number}
*/
get x() {
return this[AXES][X];
}

/**
*
* @throws SetNotImplementedError
*/
set x(_) {
throw new Error('set x() not implemented');
}

/**
*
* @returns {number}
*/
get y() {
return this[AXES][Y];
}

/**
*
* @throws SetNotImplementedError
* @returns {VectorType}
*/
set y(_) {
throw new Error('set y() not implemented');
}

/**
*
* @returns {number}
*/
get z() {
return this[AXES][Z];
}

/**
*
* @throws SetNotImplementedError
*/
set z(_) {
throw new Error('set z() not implemented');
}

toVector() {
return new Vector(this.x, this.y, this.z);
}
}

/**
* @param {() => number} alg
* @return {Vector | Victor | number}
* @return {VectorType | VictorType}
*/
export function calc(alg) {
return operatorCalc(alg);
}

/**
* @typedef {(x: number, y: number, z: number) => VectorType} vector
* @param {number} x
* @param {number} y
* @param {number} z
* @return {VectorType}
*/
export function vector(x, y, z) {
return new Vector(x, y, z);
}

/**
* @typedef {(x: number, y: number, z: number) => VictorType} victor
* @param {number} x
* @param {number} y
* @param {number} z
* @return {VictorType}
*/
export function victor(x, y, z) {
return new Victor(x, y, z);
}
Loading

0 comments on commit dedcc9a

Please sign in to comment.