// ДЗ: Замыкания
// задание 1 makeProfileTimer
{
  function makeProfileTimer() {
    const startTime = performance.now();

    return function () {
      return performance.now() - startTime;
    };
  }
}

{
  // использование функции
  var timer = makeProfileTimer();
  alert('Замеряем время работы этого alert');
  alert(timer() + ' микросекунд');
}

// задание 2 makeSaver
{
  function makeSaver(func) {
    let savedValue;
    let hasSavedValue = false;

    return function () {
      if (!hasSavedValue) {
        savedValue = func();
        hasSavedValue = true;
      }

      return savedValue;
    };
  }
}

// задание 3 моя привязка
{
  function myBind(func, thisArg, defaultArgs) {
    return function (...args) {
      let finalArgs = [];

      for (let i = 0; i < defaultArgs.length; i++) {
        if (defaultArgs[i] === undefined) {
          finalArgs.push(args[0]);
          args.shift();
        } else {
          finalArgs.push(defaultArgs[i]);
        }
      }

      finalArgs = [...finalArgs, ...args];
      return func.apply(thisArg, finalArgs);
    };
  }
}

// задание 4 проверить результат
{
  function checkResult(original, validator) {
    return function (...params) {
      let result = original(...params);
      while (!validator(result)) {
        result = original(...params);
      }
      return result;
    };
  }
}

{
  const randomHigh = checkResult(Math.random, (x) => x >= 0.5 && x <= 1);

  const alwaysSayYes = checkResult(confirm, (x) => x === true);

  const respectMe = checkResult(
    () => {
      const name = prompt('Как Вас зовут?', '');
      const age = prompt('Сколько Вам лет?', '');
      const profession = prompt('Кем Вы работаете?', '');

      return { name, age, profession };
    },
    (x) => x.name && x.age && x.profession,
  );
}
