export const math = { abs: (n: number) => Math.abs(n), floor: (n: number) => Math.floor(n), ceil: (n: number) => Math.ceil(n), round: (n: number) => Math.round(n), min: (...nums: number[]) => { if (nums.length === 0) throw new Error('min: expected at least one argument') return Math.min(...nums) }, max: (...nums: number[]) => { if (nums.length === 0) throw new Error('max: expected at least one argument') return Math.max(...nums) }, pow: (base: number, exp: number) => Math.pow(base, exp), sqrt: (n: number) => { if (n < 0) throw new Error(`sqrt: cannot take square root of negative number ${n}`) return Math.sqrt(n) }, random: (min = 0, max = 1) => { if (min === 0 && max === 1) return Math.random() return Math.floor(Math.random() * (max - min + 1)) + min }, clamp: (n: number, min: number, max: number) => { if (min > max) throw new Error(`clamp: min (${min}) must be less than or equal to max (${max})`) return Math.min(Math.max(n, min), max) }, sign: (n: number) => Math.sign(n), trunc: (n: number) => Math.trunc(n), // predicates 'even?': (n: number) => n % 2 === 0, 'odd?': (n: number) => n % 2 !== 0, 'positive?': (n: number) => n > 0, 'negative?': (n: number) => n < 0, 'zero?': (n: number) => n === 0, }