code: function compose() {
    var funcs = slice.call(arguments);
  
    return function() {
      var thisArg = this;
      var boundFuncs = funcs.map(function(func) {
        return function() {
          return promise.Promise.from(func.apply(thisArg, arguments));
        };
      });
  
      var args = slice.call(arguments);
      args.unshift(boundFuncs);
  
      return concurrent.pipeline.apply(concurrent, args);
    };
  }
docs: The first `func` will be invoked with the other arguments that are passed. These arguments may also be promises, however instead of invoking `func` with the promises, it'll be invoked with the fulfillment values. If an argument promise is rejected, the returned promise will be rejected with the same reason.