import { useRef, useMemo } from 'react';
/**
 * 浅比较两个数组是否相同
 * @param arr1 数组1
 * @param arr2 数组2
 * @param compareKeys 要比较的 key 列表，如果不传则比较整个元素
 */
function shallowEqualArray(arr1, arr2, compareKeys) {
    if (arr1.length !== arr2.length)
        return false;
    for (let i = 0; i < arr1.length; i++) {
        const item1 = arr1[i];
        const item2 = arr2[i];
        if (compareKeys) {
            // 只比较指定的 keys
            for (const key of compareKeys) {
                if (item1[key] !== item2[key])
                    return false;
            }
        }
        else if (item1 !== item2) {
            // 比较整个元素（浅比较）
            return false;
        }
    }
    return true;
}
/**
 * 浅比较两个 Map 是否相同
 */
function shallowEqualMap(map1, map2) {
    if (map1.size !== map2.size)
        return false;
    for (const [key, value] of map1) {
        if (map2.get(key) !== value)
            return false;
    }
    return true;
}
/**
 * 返回稳定的数组引用
 * 只有当数组内容真正变化时才返回新引用
 *
 * @param value 原始数组
 * @param compareKeys 要比较的 key 列表（可选）
 * @returns 稳定的数组引用
 */
export function useStableArray(value, compareKeys) {
    const prevRef = useRef([]);
    return useMemo(() => {
        const current = value || [];
        const prev = prevRef.current;
        if (shallowEqualArray(current, prev, compareKeys)) {
            return prev; // 内容没变，返回旧引用
        }
        prevRef.current = current;
        return current;
    }, [value, compareKeys]);
}
/**
 * 返回稳定的 Map 引用
 * 只有当 Map 内容真正变化时才返回新引用
 *
 * @param buildMap 构建 Map 的函数
 * @param deps 依赖数组
 * @returns 稳定的 Map 引用
 */
export function useStableMap(buildMap, deps) {
    const prevRef = useRef(new Map());
    return useMemo(() => {
        const current = buildMap();
        const prev = prevRef.current;
        if (shallowEqualMap(current, prev)) {
            return prev; // 内容没变，返回旧引用
        }
        prevRef.current = current;
        return current;
        // eslint-disable-next-line react-hooks/exhaustive-deps
    }, deps);
}
