docs: function spawnParallel(commands, options, callback, done) {
      var _len = commands.length,
          errors = [],
          hasError = false,
          count = 0;
  
      switch (arguments.length) {
          case 1:
              options = {};
              callback = emptyFn;
              done = emptyFn;
              break;
          case 2:
              if (isFunction(options)) {
                  done = options;
                  options = {};
              } else {
                  done = emptyFn;
              }
              callback = emptyFn;
              break;
          case 3:
              if (isFunction(callback)) {
                  done = callback;
                  callback = emptyFn;
              }
              break;
      }
  
      for (var i = 0; i < _len; i++) {
          iterate(commands[i], checkAndCallDone);
      }
  
      function iterate(cmd, checkAndCallDone) {
          var child, argv, args, opts, next;
  
          if (Array.isArray(cmd)) {
              argv = _spawnArgs(cmd, options);
              cmd = argv[0];
              args = argv[1];
              opts = argv[2];
              next = argv[3];
              child = _spawn(cmd, args, opts, next);
          } else if (isFunction(cmd)) {
              callback(cmd, child, opts, i);
              cmd(checkAndCallDone);
              return;
          } else {
              opts = getOptions(options);
              child = _spawn(cmd, null, opts, emptyFn);
          }
  
          callback(cmd, child, opts, i);
          child.once('exit', checkAndCallDone);
      }
  
      function checkAndCallDone(err) {
          if (err) {
              hasError = true;
          }
          errors.push(err);
  
          if (++count === _len) {
              done(hasError ? errors : null);
          }
      }
  }