function either(...args) {
    /** @type { object & {capture?: boolean} }  */
    const opts = stripOptionsFromArgs(args);
    const joined = '('
      + (opts.capture ? "" : "?:")
      + args.map((x) => source(x)).join("|") + ")";
    return joined;
  }
Any of the passed expresssions may match

Creates a huge this | this | that | that match
@param {(RegExp | string)[] | [...(RegExp | string)[], RegexEitherOptions]} args
@returns {string}