function _array_like_to_array(arr, len) {
    if (len == null || len > arr.length) len = arr.length;
    for(var i = 0, arr2 = new Array(len); i < len; i++)arr2[i] = arr[i];
    return arr2;
}
function _array_without_holes(arr) {
    if (Array.isArray(arr)) return _array_like_to_array(arr);
}
function _iterable_to_array(iter) {
    if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
}
function _non_iterable_spread() {
    throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
}
function _to_consumable_array(arr) {
    return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
}
function _unsupported_iterable_to_array(o, minLen) {
    if (!o) return;
    if (typeof o === "string") return _array_like_to_array(o, minLen);
    var n = Object.prototype.toString.call(o).slice(8, -1);
    if (n === "Object" && o.constructor) n = o.constructor.name;
    if (n === "Map" || n === "Set") return Array.from(n);
    if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
}
import { useCallback, useLayoutEffect, useRef } from "react";
/**
 * useRefFunction Hook - 稳定函数引用 Hook
 *
 * 创建一个引用恒定的函数包装器，包装器内部始终调用最新一次渲染传入的函数实现，
 * 从而避免父组件重渲染时把"新函数引用"透传给子组件，造成子组件不必要的重新渲染。
 *
 * @description 稳定的函数引用包装器，等价于 React 团队推荐的 latestRef 模式
 * @template T - 被包装函数的类型
 * @param {T} reFunction - 当前渲染要保存的最新函数实现
 * @returns {T} 引用恒定的函数包装器，可安全作为子组件 prop 或 effect deps
 *
 * @example
 * ```tsx
 * const MyComponent = () => {
 *   const [count, setCount] = useState(0);
 *   const handleClick = useRefFunction((value: number) => {
 *     setCount(count + value);
 *   });
 *   return <ChildComponent onClick={handleClick} />;
 * };
 * ```
 *
 * @remarks
 * - 包装器在渲染期同步调用也是安全的（如 useState 的 lazy initializer），ref
 *   初始值即为传入的最新实现，后续每次 commit 阶段由 useLayoutEffect 同步刷新
 * - 用 useLayoutEffect 而非渲染期写 ref，避免 R18 并发渲染下被丢弃的渲染版本污染 ref
 */ var useRefFunction = function useRefFunction(reFunction) {
    // 初始值即为当前渲染传入的实现，保证渲染期同步调用包装器（如 useState lazy
    // initializer、useMemo）时也能拿到可用的函数。
    // useLayoutEffect 在 DOM 更新后、浏览器 paint 前同步执行，后续每次 commit
    // 阶段刷新 ref，保证 effect/事件回调里读取的 ref 永远是最新版本。
    var ref = useRef(reFunction);
    useLayoutEffect(function() {
        ref.current = reFunction;
    });
    return useCallback(function() {
        for(var _len = arguments.length, rest = new Array(_len), _key = 0; _key < _len; _key++){
            rest[_key] = arguments[_key];
        }
        var _ref;
        return (_ref = ref).current.apply(_ref, _to_consumable_array(rest));
    }, []);
};
export { useRefFunction };
