static ItIt<L> rewriteWithDollarVars_withBrackets_iterator(S input, S inputPattern, S... outPatterns) {
  ret mapI(flexMatchDollarVarsIC_withBrackets_iterator(inputPattern, input), map -> getEmits(r {
    // group it
    S grouped = replaceVars_optRound(inputPattern, map);
    if (neq(grouped, input))
      emit(ext grouped(input));
    
    // rewrite it
    for (S pat : outPatterns)
      emit(replaceVars_optRound(pat, map));
  }));
}