import { isScadVector2, isScadVector3, ScadVector, ScadVector2, ScadVector3, } from '../types/ScadVector'; import { isVector2, isVector3, Vector, Vector2, Vector3, } from '../types/Vector'; type Guard = (x: any) => x is T; export function vector2(input: Vector2 | U): ScadVector2 | U; export function vector2( input: Vector2 | T, isPlain?: Guard ): ScadVector2; export function vector2(input: Vector2 | U, isPlain?: Guard) { if (!isPlain) { if (isVector2(input)) { return toScadVector2(input); } return input; } if (isPlain(input)) { return [input, input]; } if (isVector2(input, isPlain)) { return toScadVector2(input); } throwInvalidType(input); } export function vector3(input: Vector3 | U): ScadVector3 | U; export function vector3( input: Vector3 | T, isPlain?: Guard ): ScadVector3; export function vector3(input: Vector3 | U, isPlain?: Guard) { if (!isPlain) { if (isVector3(input)) { return toScadVector3(input); } if (isVector2(input)) { return toScadVector3(vector2(input as Vector2)); } return input; } if (isPlain(input)) { return [input, input, input]; } if (isVector3(input, isPlain)) { return toScadVector3(input); } if (isVector2(input, isPlain)) { return toScadVector3(vector2(input, isPlain)); } throwInvalidType(input); } export function vector( input: Vector2 | T, isPlain: Guard ): ScadVector2; export function vector( input: Vector3 | T, isPlain: Guard ): ScadVector3; export function vector( input: Vector | T, isPlain: Guard ): ScadVector; export function vector(input: Vector2 | U): ScadVector2 | U; export function vector(input: Vector3 | U): ScadVector3 | U; export function vector(input: Vector | U): ScadVector | U; export function vector(input: Vector2): ScadVector2; export function vector(input: Vector3): ScadVector3; export function vector(input: Vector): ScadVector; export function vector( input: Vector | U, isPlain?: Guard ): ScadVector | U { if (isVector3(input, isPlain)) return toScadVector3(input); if (isVector2(input, isPlain)) return toScadVector2(input); return input; } function toScadVector2(input: Vector2): ScadVector2 { return isScadVector2(input) ? input : [input.x, input.y]; } function toScadVector3(input: Vector3 | ScadVector2): ScadVector3 { if (isScadVector2(input)) return [...input, 0 as any as T]; return isScadVector3(input) ? input : [input.x, input.y, input.z]; } function throwInvalidType(input: unknown): never { console.error({ input }); throw new Error('Invalid vector type'); }