// --------------------------------------------------makeProfileTimer-------------------------------------------------------------------

// function makeProfileTimer() {
//     let startTime = performance.now();
//     return function () {
//         return performance.now() - startTime;
//     }
// };

// const timer = makeProfileTimer();

// alert('Замеряем время работы этого alert');
// alert(`Time for this alert running is: ${timer()}`);

// --------------------------------------------------makeSaver-------------------------------------------------------------------

// function makeSaver(someFunc) {
//     let firstRun = true;
//     let saveResult;
//     return function() {
//         if(firstRun) {
//             saveResult = someFunc();
//             firstRun = false;
//             console.log(`Result is saved: ${saveResult}`);
//         }
//         return saveResult;
//     }
// }

// var saver = makeSaver(Math.random); 

// var value1 = saver();
// var value2 = saver();
// value1 === value2;

// var saver2 = makeSaver(() => console.log('saved function called') || [null, undefined, false, '', 0, Math.random()][Math.ceil(Math.random() * 6)]);
// var value3 = saver2();
// var value4 = saver2();

// value3 === value4;

// --------------------------------------------------Final Countdown-------------------------------------------------------------------

// function finalCountdown(seconds) {
//     console.log(seconds);
//     if(seconds === 1) {
//         // console.log('"поехали!"');                                    // If it is necessary to write it immediately
//         // return;                                                       // Will write Gagarin's speech without delay
//         return setTimeout(() => console.log('"поехали!"'), 1000);
//     }
//     return setTimeout(finalCountdown, 1000, seconds - 1);

// }

// finalCountdown(5);

// --------------------------------------------------myBind-----------------------------------------------------------------------

function myBind(func, myThis, myArray) {
    return function (...arguments) {
        let count = 0;
        let tempArray = myArray.map((value) =>
            (value === undefined ? arguments[count++] : value)
        );

        // let tempArray;
        // tempArray = myArray.map((value) => {
        //    ( value === undefined ? arguments[count++] : value)
        // });
        return func.call(myThis, ...tempArray);
    }
}

var pow5 = myBind(Math.pow, Math, [undefined, 5])
var cube = myBind(Math.pow, Math, [undefined, 3])

// pow5(2) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
// cube(3) // => 27

console.log(pow5(2))
console.log(cube(3))

var chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5, undefined, 8, undefined, 9])
console.log(chessMin(-1, -5, 3, 15)) // вызывает Math.min(-1, 4, -5, 5, 3, 8, 15, 9), результат -5


var zeroPrompt = myBind(prompt, window, [undefined, "46"])
var someNumber = zeroPrompt("Введите число") // вызывает prompt("Введите число","0")

console.log(myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a', 'c', 'd') === 'abcdef')