fun moveElements()

in src/main/kotlin/git4ideaClasses/IRGitModel.kt [363:398]


        fun moveElements(
            moveGroup: List<Element<T>>,
            position: Int,
        ) {
            if (moveGroup.isEmpty()) {
                return
            }
            var moveGroupNewFirstIndex = position.coerceIn(0, _elements.size - moveGroup.size)
            val elementAtNewPosition = _elements[moveGroupNewFirstIndex]
            moveGroupNewFirstIndex = shiftIndexIfNeeded(moveGroup, position, elementAtNewPosition, moveGroupNewFirstIndex)
            val minIndex = min(moveGroup.first().index, moveGroupNewFirstIndex)
            val maxIndex = max(moveGroup.last().index, (moveGroupNewFirstIndex + moveGroup.size).coerceAtMost(_elements.size - 1))

            val moveGroupIndices = moveGroup.map { it.index }.toSet()

            val saveElements = (minIndex..maxIndex).filter { it !in moveGroupIndices }.map { _elements[it] }
            val saveElementsBeforeCount = moveGroupNewFirstIndex - minIndex
            val saveElementsBeforeMoveGroup = saveElements.take(saveElementsBeforeCount)
            val saveElementsAfterMoveGroup = saveElements.drop(saveElementsBeforeCount)

            val changedElementsInterval = saveElementsBeforeMoveGroup + moveGroup + saveElementsAfterMoveGroup

            changedElementsInterval.forEachIndexed { i, element ->
                val newIndex = minIndex + i
                _elements[newIndex] = element
                element.index = newIndex
            }

            changedElementsInterval
                .map { element -> if (element is Element.UniteChild) element.root else element }
                .filterIsInstance<Element.UniteRoot<T>>()
                .distinct()
                .forEach { root ->
                    root.childrenIndicesChanged()
                }
        }