// Task makeProfileTimer

// function makeProfileTimer(){
//     const t0 = performance.now();
//     alert('Замеряем время работы этого alert');
//     return function (){
        
//         const t1 = performance.now()
//         return t1-t0;
//     }

// }
// const timer = makeProfileTimer();
// alert(timer());


//  Task makeSaver

// function makeSaver(func){
//     let result = null;
//     return function() {
//         result = ( result === null ? func() : result);
//         return result;
//     }
// }

// var saver = makeSaver(Math.random);
// var value1 = saver()              
// var value2 = saver()           
// console.log(value1 === value2)                 // всегда true

// 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()

// console.log(value3 === value4) // тоже должно быть true


// let namePrompt = prompt.bind(window, 'Как тебя зовут?')
// let nameSaver = makeSaver(namePrompt)
// alert(`Привет! Prompt еще не было!`)
// alert(`Привет ${nameSaver()}. Только что запустился prompt, первый и последний раз`)
// alert(`Слушай, ${nameSaver()}, го пить пиво. Ведь prompt был только один раз`)

// Task Final countdown

// (function () {
//     let sec = 5;
//     return function(){
//         for(let i = 0; i <= sec; i++){
//             setTimeout(()=>{
//                 console.log(sec === 0 ? "Поехали" : sec);
//                 sec--;
//             }, i * 1000)
//         }
//     }()
//     })();




// Task myBind

function myBind( func, context, arr){
    return function(...params){
        let i = 0;
        const filledArr = arr.map(item => {
            if (item){
            return item
        } else {
            i++;
            return params[i-1]
        }
    })
        return func.call(context, ...filledArr);
    }
}
var pow5 = myBind(Math.pow, Math, [undefined, 5]) 
var cube = myBind(Math.pow, Math, [undefined, 3]) 

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

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, "0"])
// var someNumber = zeroPrompt("Введите число")   

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