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],...