// let countTime = 0;
// function makeProfileTimer () {
//   countTime = performance.now();
//   return () => performance.now() -  countTime;
// }
// var timer = makeProfileTimer(); 
// alert('Замеряем время работы этого alert'); 
// alert(timer());



//makeSaver
// debugger;
// function makeSaver (arg) {
//   let storage = [];
  
//   return () => { 
//     if (storage.length) {
//       let elemArr = arg();
//       storage.push(elemArr);
//     }
    
//     return storage[0];
//   }
// }

// var saver = makeSaver(Math.random);
// var value1 = saver();
// var value2 = saver();  
// console.log(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()

// console.log(value3 === value4);

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



//Final Countdown
 
// function SelfInvoked (arg) {
//   console.log(arg);
//   arg = arg -1;
    
//   if (arg === 0) {
//     setTimeout(SelfInvoked, 1000, 'поехали!');
//     return;
//   }
//   if(arg) {
//     return setTimeout(SelfInvoked, 1000, arg);
//   }
//   return;
// }

// SelfInvoked(5);

// myBind
//debugger;
function myBind (func, obj, arr) {
  
  return function (...arg) {
      let indexArg = 0;
   
    for (let i = 0; i < arr.length; i++) {
      if (!arr[i]) {
        arr[i] = arg[indexArg];
        indexArg++;
      }
    }
    let result = func.apply(obj, arr)
    return result;
  }
  
}

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

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));

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')

