/**
 * 纯数学工具（无随机、无平台依赖），供 generators / 模板引擎使用
 */

/** 将数值限制在 [min, max] */
export function clamp(value: number, min: number, max: number): number {
    return Math.min(max, Math.max(min, value));
}

/** 最大公约数（非负整数） */
export function gcd(a: number, b: number): number {
    let x = Math.abs(Math.trunc(a));
    let y = Math.abs(Math.trunc(b));
    while (y !== 0) {
        const t = y;
        y = x % y;
        x = t;
    }
    return x || 1;
}

/** 最小公倍数 */
export function lcm(a: number, b: number): number {
    const g = gcd(a, b);
    return Math.abs(Math.trunc(a) * Math.trunc(b)) / g;
}

/** 闭区间 [min, max] 上的整数列表 */
export function integerRangeInclusive(min: number, max: number): number[] {
    const lo = Math.min(min, max);
    const hi = Math.max(min, max);
    const out: number[] = [];
    for (let i = lo; i <= hi; i += 1) {
        out.push(i);
    }
    return out;
}

/** 数组求和 */
export function sum(numbers: readonly number[]): number {
    let s = 0;
    for (let i = 0; i < numbers.length; i += 1) {
        s += numbers[i];
    }
    return s;
}

/** 算术平均（空数组为 0） */
export function mean(numbers: readonly number[]): number {
    if (numbers.length === 0) return 0;
    return sum(numbers) / numbers.length;
}

/** 各位数字之和（十进制，忽略负号） */
export function digitSum(n: number): number {
    let v = Math.abs(Math.trunc(n));
    let s = 0;
    while (v > 0) {
        s += v % 10;
        v = Math.floor(v / 10);
    }
    return s;
}

export function isEven(n: number): boolean {
    return n % 2 === 0;
}

export function isOdd(n: number): boolean {
    return !isEven(n);
}

/**
 * 将浮点数舍入到指定小数位（避免 0.1+0.2 展示问题）
 */
export function roundToDecimals(value: number, decimals: number): number {
    const p = 10 ** decimals;
    return Math.round(value * p) / p;
}
