module.exports = paginate;

const iterator = require("./iterator");

function paginate(octokit, route, options, mapFn) {
  if (typeof options === "function") {
    mapFn = options;
    options = undefined;
  }
  options = octokit.request.endpoint.merge(route, options);
  return gather(
    octokit,
    [],
    iterator(octokit, options)[Symbol.asyncIterator](),
    mapFn
  );
}

function gather(octokit, results, iterator, mapFn) {
  return iterator.next().then(result => {
    if (result.done) {
      return results;
    }

    let earlyExit = false;
    function done() {
      earlyExit = true;
    }

    results = results.concat(
      mapFn ? mapFn(result.value, done) : result.value.data
    );

    if (earlyExit) {
      return results;
    }

    return gather(octokit, results, iterator, mapFn);
  });
}
