var range = function(from, to) {
return function(cb) {
for (var i = from; i <= to; i++) cb(i);
}
}
var map = function(numbers, fn) {
return function(cb) {
numbers(function(i) { cb(fn(i)); });
}
}
var reverse = function(numbers) {
var continua = function(ofn, fn, param) {
return function() { fn(param), ofn(fn, param); }
}
return function(cb) {
var inner = function() {};
numbers(function(i) { inner = continua(inner, cb, i); });
inner();
}
}
var foreach = function(numbers, fn) {
numbers(fn);
}
var numbers = range(1, 11);
numbers = map(numbers, function(n) { return n * n });
numbers = reverse(numbers);
foreach(numbers, console.log);