docs: function explore(start, callfile, calldir, options, done) {
      const argsLen = arguments.length;
  
      switch (argsLen) {
          case 0:
          case 1:
              throw new Error("Too few arguments");
          case 2:
              break;
          case 3:
              if (isFunction(calldir)) {
                  done = calldir;
              } else if (isObject(calldir)) {
                  options = calldir;
              }
              calldir = null;
              break;
          case 4:
              if (isFunction(options)) {
                  done = options;
                  options = null;
              }
  
              if (isObject(calldir)) {
                  options = calldir;
                  calldir = null;
              }
              break;
          default:
              // Nothing to do
      }
  
      if (!isFunction(callfile)) {
          throw new Error("callfile must be a function");
      }
  
      options = Object.assign({}, defaultOptions, options);
  
      if (!isFunction(callfile)) {
          callfile = nextFileFn;
      }
  
      if (!isFunction(calldir)) {
          calldir = nextDirectoryFn;
      }
  
      if (!isFunction(done)) {
          done = emptyFn;
      }
  
      _explore(start, callfile, calldir, options, done);
  }