JSFiddle - React, Tailwind, and code Playground

by mayorovp

JavaScript

function Reduced (result) { this.wrapped = result; }

function reduceList(list /*, step1, step2, ...*/) {
    var step = function stepList (result, item) {
        if (arguments.length == 0) return []; // Start of iteration
        if (arguments.length == 1) return result; // End of iteration
        if (arguments.length == 2) return result.push(item), result;
    }
    for (var i=arguments.length-1; i>=1; i--)
        step = arguments[i](step);
    
    var result = step();
    for (var i=0; i<list.length && !(result instanceof Reduced); i++)
        result = step(result, list[i]);
    
    if (result instanceof Reduced)
        return result.wrapped;
    else 
        return step(result);
}

function take(n) {
    if (n == 0)
        return function take0(step) {
            return function take0Step(result, item) {
                return new Reduced(step());
            }
        }
    
    return function takeT(step) {
        var count = n;
        return function takeStep(result, item) {
            if (arguments.length == 0) return step();
            if (arguments.length == 1) return result;
            if (--count == 0)
                return new Reduced(step(result, item));
            else
                return step(result, item);
        }
    }
}

function append(/*args*/) {
    var args = arguments;
    return function appendT(step) {
        return function appendStep(result, item) {
            if (arguments.length== 0) return step();
            if (arguments.length == 2) return step(result, item);
            
            for (var i=0; i<args.length; i++)
                result = step(result, args[i]);
            return result;
        }
    }
}

console.log("Тест номер 1");
console.log(reduceList([1,2,3,4,5], take(3))); // [1,2,3]
console.log(reduceList([1,2,3], append(6,7))); // [1,2,3,6,7]
console.log(reduceList([1,2,3,4,5], take(3), append(6,7))); // [1,2,3] - Может, мы перепутали аргументы местами?..
console.log(reduceList([1,2,3,4,5],...