export function float(value: string | number | undefined): number { if (typeof value === "number") return value; if (value === undefined) value = ""; const float = parseFloat(value); if (isNaN(float)) { throw new Error(`Expected '${value}' to be a float!`); } return float; } export function flatten(arr: T[][]): T[] { const result: T[] = []; for (let subarr of arr) { result.push(...subarr); } return result; } /** * Convert radians to degrees. */ export function rad2deg(radians: number): number { return (radians * 180) / Math.PI; } export type NumericInterval = { min: number; max: number; }; export type NumericRange = NumericInterval & { step: number; }; /** * Return numbers within the given range, inclusive. */ export function inclusiveRange({ min, max, step }: NumericRange): number[] { const result: number[] = []; for (let i = min; i <= max; i += step) { result.push(i); } return result; } /** * Return an array containing the numbers from 0 to one * less than the given value, increasing. */ export function range(count: number): number[] { return inclusiveRange({ min: 0, max: count - 1, step: 1 }); } /** * Slugify the given string. * * Taken from: https://gist.github.com/mathewbyrne/1280286 */ export function slugify(text: string) { return text .toString() .toLowerCase() .replace(/\s+/g, "-") // Replace spaces with - .replace(/[^\w\-]+/g, "") // Remove all non-word chars .replace(/\-\-+/g, "-") // Replace multiple - with single - .replace(/^-+/, "") // Trim - from start of text .replace(/-+$/, ""); // Trim - from end of text } /** Returns whether the given number is even (as opposed to odd). */ export function isEvenNumber(value: number) { return value % 2 === 0; } /** * Convert the given number of seconds (float) to milliseconds (integer). */ export function secsToMsecs(secs: number): number { return Math.floor(secs * 1000); } /** * Returns the given number to a "friendly-looking" human * representation that is not ridiculously long. For example, * it will return "1.85" instead of "1.850000000143". */ export function toFriendlyDecimal(value: number, maxDecimalDigits = 2): string { const str = value.toString(); const fixedStr = value.toFixed(maxDecimalDigits); return str.length < fixedStr.length ? str : fixedStr; }