//profiletimer
function makeProfileTimer() {
    let start = performance.now ()
    function finishOfTime () {
        let finish = performance.now()
        return (finish - start) / 1000;
    }
    return finishOfTime;
}

var timer = makeProfileTimer()
alert('Замеряем время работы этого alert');  
alert(timer())


//makesaver
function makeSaver (fn){
    let result;
    let somethingThatHelp = true ;
      return () => {
        if (somethingThatHelp){
        result = fn();
        }
        somethingThatHelp = false
        return result
        }
      }
    
    let nameSaver = makeSaver(() => prompt('введите имя'))
    alert ('имя еще не спрашивали')
    let name1 = nameSaver()
    alert ('just ask name')
    let name2 = nameSaver()
    alert ("tho times ask?")
    alert ("hello , " + nameSaver() + (nameSaver() === nameSaver() ? ". done" : 'shit happens'))

    //finalCountdouwn
    function finalCountdown() {
        let countdown = 5; 
        function someFunction() {
          console.log(countdown--)
        }
        if (!countdown){
          clearTimeout(timer)
        }
        for (let i = 1; i <6; i++){
        let timer = setTimeout(someFunction , 1000*i)
        }
      }
      
      finalCountdown()

      //myBind

      function myBind (funcn, context, arr) {
        return (...params) => {
            let indexParam = 0;
            let newArray = arr.map((i) => (i === undefined ? params[indexParam++] : i))
            return func.call(context, ...newArray)
        }
    }
      
      var pow5 = myBind(Math.pow, Math, [undefined, 5])  
      var cube = myBind(Math.pow, Math, [undefined, 3]) 
      
      alert(pow5(2)) // => 32, вызывает Math.pow(2,5), соотнесите с [undefined, 5]
      alert (cube(3)) // => 27
      
      
      var chessMin = myBind(Math.min, Math, [undefined, 4, undefined, 5,undefined, 8,undefined, 9])
      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("Введите число")              // вызывает prompt("Введите число","0")
      
      console.log(myBind((...params) => params.join(''), null, [undefined, 'b', undefined, undefined, 'e', 'f'])('a','c','d') === 'abcdef')
      