JSFiddle - React, Tailwind, and code Playground

by air_hadoken

JavaScript

function promiseChain(firstfn) {
    var fns = Array.from(arguments).slice(1);
    return function() {
      var promise = Promise.resolve(firstfn.apply(null, arguments));
      return fns.reduce(function(_promise, fn) {
        return _promise.then(fn);
      }, promise);
    };
  }
  
function promiseMap(list, fn) {
	return Promise.resolve(list).then(function(resolved_list) {
  	resolved_list = Array.isArray(resolved_list) ? resolved_list : [resolved_list];
    return Promise.all(resolved_list.map(fn));
  });
}

function promiseFilter(list, fn) {
	return Promise.all([
  	Promise.resolve(list),
    promiseMap(list, fn)
  ]).then(function(pack) {
  	var values = pack[0], processed = pack[1], returns = [];
    values.forEach(function(v, i) {
    	if(processed[i]) {
      	returns.push(v);
      }
    });
    return returns;
  });
}

function promiseReduce(list, fn, initial) {
	return Promise.all([list, initial]).then(function(pack) {
  	var resolved_list = pack[0], resolved_initial = pack[1] || resolved_list.shift();
    return Promise.resolve(resolved_list.reduce(function(a, b) {
    	return Promise.resolve(a).then(function(resolved_a) { return fn(resolved_a, b); });
    }, resolved_initial));
  });
}

function print(expected, obj) {
	if(arguments.length < 1) {
  	obj = expected;
    expected = null;
  }
	document.body.innerHTML += JSON.stringify(obj);
  if(expected) {
		document.body.innerHTML += " should be " + JSON.stringify(expected);  
  }
  document.body.innerHTML += "<br>\n";
  return obj;
}

promiseChain(
	function(a) {
		return Promise.resolve(a + 1);
	},
  function(b) {
  	return Promise.resolve(b * 2);
  }
)(5).then(print.bind(null, 12));

promiseMap([1,2,3,4,5], function(v) { return v * 2; })
.then(print.bind(null, [2,4,6,8,10]));

promiseMap(Promise.resolve([1,2,3,4,5]), function(v) {
	return new Promise(function(res) {
  	setTimeout(function() {
    	res(v * 2);
    }, 10);
  });
}).then(print.bind(null, [2,4,6,8,10]));

promiseReduce([1,2,3,4,5],...