<commit_before>(function () {

    /**
     *Класс отвечает за отображение и хранение информации о пузырьке
     * @param content {int} - содержимое
     * @param position {int} - номер пузырька
     * @param parent {jQuery} - ссылка на контейнер
     */
    function Bubble( content, position, parent ) {

        this.element = $('<div/>', {
            class: 'bubble',
            text: content
        }).css({
            'left': (25 + 80 * position) + 'px'
        }).appendTo(parent)[0];

        this.value = content;
    }

    /**
     * Главный класс
     * @param element {jQuery} - ссылка на элемент
     */
    function Sort( element ) {
        var bubbles = [],
            animations = [],
            isStop = false,
            currentBubbles = [];

        this.element = element;

        /**
         * Инициализация и отрисовка пузырьков
         */
        this.init = function () {
            var bubble = null,
                elementsCount = $('#elementsCount').val(),
                array = [];
            try {
                element.empty().hide();
                $('.old-bubbles-js').remove();

                array = _getArray(elementsCount);

                bubbles = [];
                for (var i = 0; i < array.length; i++) {
                    bubble = new Bubble(array[i], i, element);
                    bubbles.push(bubble);
                }
                element.prepend('<p>Сгенерированный массив:</p>');
                element.fadeIn();
            }
            catch (err) {
                alert(err);
                $('.buttons__sort').addClass('disabled');
            }

        };

        /**
         * Функция сортировки
         * Выолняет сортировку массива, а так же заполняет цепочку промисов,
         * выполняющих анимацию
         */
        this.sort = function () {
            var originalBubbles = element.clone(),
                len = bubbles.length,
                $bubble1 = null,
                $bubble2 = null,
                temp = 0,
                isSwap = false;

            isStop = false;
            animations = [];
            originalBubbles.hide()
                .addClass('old-bubbles-js');
            element.after(originalBubbles);


            $('.old-bubbles-js').fadeIn(500, function () {
                element.find('p').text('Идёт сортировка...');
                for (var i = 0; i < len; i++) {
                    for (var j = 0; j < len - i - 1; j++) {
                        isSwap = false;
                        $bubble1 = $(bubbles[j].element);
                        $bubble2 = $(bubbles[j + 1].element);

                        if (bubbles[j].value > bubbles[j + 1].value) {
                            temp = bubbles[j];
                            bubbles[j] = bubbles[j + 1];
                            bubbles[j + 1] = temp;
                            isSwap = true
                        }
                        animations.push({
                            bubble1: $bubble1,
                            bubble2: $bubble2,
                            isSwap: isSwap
                        });
                    }
                }
                console.log(animations);
                _animateBubbles(animations, 0)
            });

        };

        /**
         * Функция паузы анимации
         */
        this.pauseAnimations = function () {
            currentBubbles[0].pause();
            currentBubbles[1].pause();
        };

        /**
         * Функция продолжения анимации
         */
        this.resumeAnimations = function () {
            currentBubbles[0].resume();
            currentBubbles[1].resume();
        };

        /**
         * Функция отмены анимации
         */
        this.stopAnimations = function () {
            isStop = true;
            $('.old-bubbles-js').remove();
            $('.bubbles').html('');
        };

        /**
         * Функция вызывается по окончанию либо по прерыванию сортировки
         * @private
         */
        function _afterSort() {
            $('.buttons__generate').removeClass('disabled');
            element.find('p').text('Отсортированный массив:');
            $('.buttons__pause').addClass('disabled');
            $('.buttons__stop').addClass('disabled');
            $('.buttons__pause').addClass('disabled');
            animations = [];
            isStop = false;
        }

        /**
         * Фукнция взаимодействия пузырьков
         * @param animations {Array} - массив с пузырьками
         * @param index {Number} - индекс массива
         * @private
         */
        function _animateBubbles( animations, index ) {
            var $bubble1 = animations[index].bubble1,
                $bubble2 = animations[index].bubble2,
                isSwap = animations[index].isSwap,
                bubble1LeftOffset = $bubble1.css('left'),
                bubble2LeftOffset = $bubble2.css('left');

            $bubble1.addClass('bubble-current');
            $bubble2.addClass('bubble-current');

            currentBubbles[0] = $bubble1;
            currentBubbles[1] = $bubble2;
            $bubble1.animate({top: '40px'}, 700, function () {
                if (isSwap) {
                    $bubble1.animate({top: '-10px'}, 150, function () {
                        $bubble1.animate({left: bubble2LeftOffset}, 150, function () {
                            $bubble2.animate({top: '40px'}, 150);
                            $bubble1.animate({top: '40px'}, 150, function(){
                                $bubble1.removeClass('bubble-current');
                                $bubble2.removeClass('bubble-current');

                                if (!isStop && animations[index + 1]) {
                                    _animateBubbles(animations, index + 1)
                                } else {
                                    _afterSort();
                                }
                            })
                        });
                        $bubble2.animate({left: bubble1LeftOffset}, 150);
                    });
                    $bubble2.animate({top: '90px'}, 150)
                } else {
                    $bubble1.removeClass('bubble-current');
                    $bubble2.removeClass('bubble-current');
                    if (!isStop && animations[index + 1]) {
                        _animateBubbles(animations, index + 1)
                    } else {
                        _afterSort();
                    }
                }
            });
        }

        /**
         * Функция генерирует массив, либо считывает введенный
         * @param amount - количество элементов
         * @returns {Array} - ввденный или сгенерированный массив
         * @private
         */
        function _getArray( amount ) {
            var array = [];

            if ($('#generate-array').is(':checked')){
                for (var i = 0; i < amount; i++) {
                    array.push(_getRandomNumber(0, 999));
                }
            } else {
                array = _getArrayFromInput();
            }

            return array;
        }

        /**
         * Функция считывает массив из инпута
         * @returns {Array}
         * @private
         */
        function _getArrayFromInput(){
            var inputValue = $('#array').val(),
                array = inputValue.split(','),
                number = 0;

            if (array.length < 2) {
                throw 'Слишком короткий массив';
            }

            if (array.length > 10) {
                throw 'Слишком длинный массив';
            }

            for (var i = 0; i < array.length; i++) {
                number = parseInt(array[i]);
                if (number !== Number.NaN && number > -1000 && number < 1000){
                    array[i] = parseInt(array[i])
                } else {
                    throw 'Неверный формат'
                }
            }

            return array;
        }

        /**
         * Метод генерации числа
         * @param min - минимальное значение
         * @param max - Максимальное значение
         * @returns {number} - случайное число от min до max
         * @private
         */
        function _getRandomNumber( min, max ) {
            return Math.floor(Math.random() * (max - min) + min);
        }
    }

    /**
     * Функция вызывается по событию document.ready
     * Вешает обработчики и инициализирует классы
     *
     */
    $(function () {
        var sort = new Sort($('.bubbles'));
        _initHandlers(sort);
    });

    /**
     * Функция вешает обрабочики на события
     * @param sort - ссылка на объект класса Sort
     * @private
     */
    function _initHandlers(sort) {
        $('.buttons__generate').click(function () {
            if (!$(this).hasClass('disabled')) {
                $('.buttons__sort').removeClass('disabled');
                sort.init();
            }
        });

        $('.buttons__sort').click(function () {
            if (!$(this).hasClass('disabled')) {
                $(this).addClass('disabled');
                $('.buttons__generate').addClass('disabled');
                $('.buttons__pause').removeClass('disabled');
                $('.buttons__stop').removeClass('disabled');
                sort.sort();
            }
        });

        $('.buttons__resume').click(function () {
            if (!$(this).hasClass('disabled')) {
                $(this).addClass('disabled');
                $('.buttons__pause').removeClass('disabled');
                $('.buttons__stop').removeClass('disabled');
                sort.resumeAnimations()
            }
        });

        $('.buttons__pause').click(function () {
            if (!$(this).hasClass('disabled')) {
                $(this).addClass('disabled');
                $('.buttons__resume').removeClass('disabled');
                $('.buttons__stop').addClass('disabled');
                sort.pauseAnimations();
            }
        });

        $('.buttons__stop').click(function () {
            if (!$(this).hasClass('disabled')) {
                $(this).addClass('disabled');
                $('.buttons__resume').addClass('disabled');
                $('.buttons__pause').addClass('disabled');
                sort.stopAnimations();
            }
        });

        $('.instructions h4').click(function () {
            $(this).next().slideToggle();
            $(this).find('span')
                .html($(this).find('span').html() == '+' ? '-' : '+')
        });
<commit_msg>1. отмена сортировки на паузе<commit_after>(function () {

    /**
     *Класс отвечает за отображение и хранение информации о пузырьке
     * @param content {int} - содержимое
     * @param position {int} - номер пузырька
     * @param parent {jQuery} - ссылка на контейнер
     */
    function Bubble( content, position, parent ) {

        this.element = $('<div/>', {
            class: 'bubble',
            text: content
        }).css({
            'left': (25 + 80 * position) + 'px'
        }).appendTo(parent)[0];

        this.value = content;
    }

    /**
     * Главный класс
     * @param element {jQuery} - ссылка на элемент
     */
    function Sort( element ) {
        var bubbles = [],
            animations = [],
            isStop = false,
            currentBubbles = [];

        this.element = element;

        /**
         * Инициализация и отрисовка пузырьков
         */
        this.init = function () {
            var bubble = null,
                elementsCount = $('#elementsCount').val(),
                array = [];
            try {
                element.empty().hide();
                $('.old-bubbles-js').remove();

                array = _getArray(elementsCount);

                bubbles = [];
                for (var i = 0; i < array.length; i++) {
                    bubble = new Bubble(array[i], i, element);
                    bubbles.push(bubble);
                }
                element.prepend('<p>Сгенерированный массив:</p>');
                element.fadeIn();
            }
            catch (err) {
                alert(err);
                $('.buttons__sort').addClass('disabled');
            }

        };

        /**
         * Функция сортировки
         * Выолняет сортировку массива, а так же заполняет цепочку промисов,
         * выполняющих анимацию
         */
        this.sort = function () {
            var originalBubbles = element.clone(),
                len = bubbles.length,
                $bubble1 = null,
                $bubble2 = null,
                temp = 0,
                isSwap = false;

            isStop = false;
            animations = [];
            originalBubbles.hide()
                .addClass('old-bubbles-js');
            element.after(originalBubbles);


            $('.old-bubbles-js').fadeIn(500, function () {
                element.find('p').text('Идёт сортировка...');
                for (var i = 0; i < len; i++) {
                    for (var j = 0; j < len - i - 1; j++) {
                        isSwap = false;
                        $bubble1 = $(bubbles[j].element);
                        $bubble2 = $(bubbles[j + 1].element);

                        if (bubbles[j].value > bubbles[j + 1].value) {
                            temp = bubbles[j];
                            bubbles[j] = bubbles[j + 1];
                            bubbles[j + 1] = temp;
                            isSwap = true
                        }
                        animations.push({
                            bubble1: $bubble1,
                            bubble2: $bubble2,
                            isSwap: isSwap
                        });
                    }
                }
                console.log(animations);
                _animateBubbles(animations, 0)
            });

        };

        /**
         * Функция паузы анимации
         */
        this.pauseAnimations = function () {
            currentBubbles[0].pause();
            currentBubbles[1].pause();
        };

        /**
         * Функция продолжения анимации
         */
        this.resumeAnimations = function () {
            currentBubbles[0].resume();
            currentBubbles[1].resume();
        };

        /**
         * Функция отмены анимации
         */
        this.stopAnimations = function () {
            currentBubbles[0].resume();
            currentBubbles[1].resume();
            isStop = true;
            $('.old-bubbles-js').remove();
            $('.bubbles').html('');
        };

        /**
         * Функция вызывается по окончанию либо по прерыванию сортировки
         * @private
         */
        function _afterSort() {
            $('.buttons__generate').removeClass('disabled');
            element.find('p').text('Отсортированный массив:');
            $('.buttons__pause').addClass('disabled');
            $('.buttons__stop').addClass('disabled');
            $('.buttons__pause').addClass('disabled');
            animations = [];
            isStop = false;
        }

        /**
         * Фукнция взаимодействия пузырьков
         * @param animations {Array} - массив с пузырьками
         * @param index {Number} - индекс массива
         * @private
         */
        function _animateBubbles( animations, index ) {
            var $bubble1 = animations[index].bubble1,
                $bubble2 = animations[index].bubble2,
                isSwap = animations[index].isSwap,
                bubble1LeftOffset = $bubble1.css('left'),
                bubble2LeftOffset = $bubble2.css('left');

            $bubble1.addClass('bubble-current');
            $bubble2.addClass('bubble-current');

            currentBubbles[0] = $bubble1;
            currentBubbles[1] = $bubble2;
            $bubble1.animate({top: '40px'}, 700, function () {
                if (isSwap) {
                    $bubble1.animate({top: '-10px'}, 150, function () {
                        $bubble1.animate({left: bubble2LeftOffset}, 150, function () {
                            $bubble2.animate({top: '40px'}, 150);
                            $bubble1.animate({top: '40px'}, 150, function(){
                                $bubble1.removeClass('bubble-current');
                                $bubble2.removeClass('bubble-current');

                                if (!isStop && animations[index + 1]) {
                                    _animateBubbles(animations, index + 1)
                                } else {
                                    _afterSort();
                                }
                            })
                        });
                        $bubble2.animate({left: bubble1LeftOffset}, 150);
                    });
                    $bubble2.animate({top: '90px'}, 150)
                } else {
                    $bubble1.removeClass('bubble-current');
                    $bubble2.removeClass('bubble-current');
                    if (!isStop && animations[index + 1]) {
                        _animateBubbles(animations, index + 1)
                    } else {
                        _afterSort();
                    }
                }
            });
        }

        /**
         * Функция генерирует массив, либо считывает введенный
         * @param amount - количество элементов
         * @returns {Array} - ввденный или сгенерированный массив
         * @private
         */
        function _getArray( amount ) {
            var array = [];

            if ($('#generate-array').is(':checked')){
                for (var i = 0; i < amount; i++) {
                    array.push(_getRandomNumber(0, 999));
                }
            } else {
                array = _getArrayFromInput();
            }

            return array;
        }

        /**
         * Функция считывает массив из инпута
         * @returns {Array}
         * @private
         */
        function _getArrayFromInput(){
            var inputValue = $('#array').val(),
                array = inputValue.split(','),
                number = 0;

            if (array.length < 2) {
                throw 'Слишком короткий массив';
            }

            if (array.length > 10) {
                throw 'Слишком длинный массив';
            }

            for (var i = 0; i < array.length; i++) {
                number = parseInt(array[i]);
                if (number !== Number.NaN && number > -1000 && number < 1000){
                    array[i] = parseInt(array[i])
                } else {
                    throw 'Неверный формат'
                }
            }

            return array;
        }

        /**
         * Метод генерации числа
         * @param min - минимальное значение
         * @param max - Максимальное значение
         * @returns {number} - случайное число от min до max
         * @private
         */
        function _getRandomNumber( min, max ) {
            return Math.floor(Math.random() * (max - min) + min);
        }
    }

    /**
     * Функция вызывается по событию document.ready
     * Вешает обработчики и инициализирует классы
     *
     */
    $(function () {
        var sort = new Sort($('.bubbles'));
        _initHandlers(sort);
    });

    /**
     * Функция вешает обрабочики на события
     * @param sort - ссылка на объект класса Sort
     * @private
     */
    function _initHandlers(sort) {
        $('.buttons__generate').click(function () {
            if (!$(this).hasClass('disabled')) {
                $('.buttons__sort').removeClass('disabled');
                sort.init();
            }
        });

        $('.buttons__sort').click(function () {
            if (!$(this).hasClass('disabled')) {
                $(this).addClass('disabled');
                $('.buttons__generate').addClass('disabled');
                $('.buttons__pause').removeClass('disabled');
                $('.buttons__stop').removeClass('disabled');
                sort.sort();
            }
        });

        $('.buttons__resume').click(function () {
            if (!$(this).hasClass('disabled')) {
                $(this).addClass('disabled');
                $('.buttons__pause').removeClass('disabled');
                $('.buttons__stop').removeClass('disabled');
                sort.resumeAnimations()
            }
        });

        $('.buttons__pause').click(function () {
            if (!$(this).hasClass('disabled')) {
                $(this).addClass('disabled');
                $('.buttons__resume').removeClass('disabled');
                sort.pauseAnimations();
            }
        });

        $('.buttons__stop').click(function () {
            if (!$(this).hasClass('disabled')) {
                $(this).addClass('disabled');
                $('.buttons__resume').addClass('disabled');
                $('.buttons__pause').addClass('disabled');
                sort.stopAnimations();
            }
        });

        $('.instructions h4').click(function () {
            $(this).next().slideToggle();
            $(this).find('span')
                .html($(this).find('span').html() == '+' ? '-' : '+')
        });

{'fraction_non_alphanumeric': 0.13582174283281295, 'fraction_numerical': 0.010644337212602896, 'mean_word_length': 1.2258607981467833, 'pattern_counts': {'":': 0, '<': 23, '<?xml version=': 0, '>': 15, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 8, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '5781221', 'n_tokens_mistral': 5969, 'n_tokens_neox': 5853, 'n_words': 1021}