//makeProfileTimer
function makeProfileTimer() {
    let prev = performance.now();

    return function () {
        let next = performance.now();
        return ("Время выполнения: " + (next - prev));
    }
}

//makeSaver
function makeSaver(el) {
    let result;
    let doFunc = true;

    return function () {
        if (doFunc) {
            result = el();
            doFunc = false;
        }
        return result;
    }
}

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

value3 === value4 // тоже true


//Final Countdown
function finalCountdown(lastCountNumber) {              //параметр число с которого начинается обратный отсчёт
    if (lastCountNumber >= 0) {
        setTimeout((function () {
            lastCountNumber === 0 ? console.log("поехали!") : console.log(lastCountNumber);

            finalCountdown(lastCountNumber - 1);
        }), 1000)
    }
}

//myBind
function myBind(func, context, ...args) {
    let argsCopy = args;
    argsCopy = argsCopy.flat();

    return function (...args2) {
        let j = 0;

        for (let i = 0; i < argsCopy.length; i++) {
            if (argsCopy[i] === undefined) {
                argsCopy[i] = args2[j]
                j++;
            }
        }
        return func.call(context, ...argsCopy)
    }
}

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

pow5(2) // => 32, вызывает Math.pow(2,5)
cube(3) // => 27, вызывает Math.pow(3,3)


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

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

