"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.preserveNodeOrder = void 0;
/**
 * Гарантирует неизменность порядка узлов при операциях выбора элементов в дереве
 */
const preserveNodeOrder = (tree, nodeOrderRef) => {
    // Обновляем порядок узлов: сохраняем существующий или используем порядок из дерева
    const updateNodeOrder = (nodes) => {
        nodes.forEach((node) => {
            const nodeWithOrder = node;
            const orderFromTree = nodeWithOrder.options?.order;
            if (!nodeOrderRef.has(node.id)) {
                nodeOrderRef.set(node.id, orderFromTree ?? nodeOrderRef.size);
            }
            if (node.children) {
                updateNodeOrder(node.children);
            }
        });
    };
    updateNodeOrder(tree);
    // Сортируем дерево по сохраненному порядку
    const sortByOrder = (nodes) => [...nodes]
        .sort((a, b) => {
        const orderA = nodeOrderRef.get(a.id) ?? Infinity;
        const orderB = nodeOrderRef.get(b.id) ?? Infinity;
        return orderA - orderB;
    })
        .map((node) => ({
        ...node,
        children: node.children ? sortByOrder(node.children) : undefined,
    }));
    return sortByOrder(tree);
};
exports.preserveNodeOrder = preserveNodeOrder;
