 
     output("\n\n")
 
-    print("Generating quantifiers...", to: &standardError)
+    log("Generating quantifiers...")
     for arity in 0...maxArity {
-      print("  Arity \(arity): ", terminator: "", to: &standardError)
+      log("  Arity \(arity): ", terminator: "")
       for kind in QuantifierKind.allCases {
-        print("\(kind.rawValue) ", terminator: "", to: &standardError)
+        log("\(kind.rawValue) ", terminator: "")
         emitQuantifier(kind: kind, arity: arity)
       }
-      print("repeating ", terminator: "", to: &standardError)
+      log("repeating ", terminator: "")
       emitRepeating(arity: arity)
-      print(to: &standardError)
-    }
-
-    print("Generating atomic groups...", to: &standardError)
+      log("")
+    }
+
+    log("Generating atomic groups...")
     for arity in 0...maxArity {
-      print("  Arity \(arity): ", terminator: "", to: &standardError)
+      log("  Arity \(arity): ", terminator: "")
       emitAtomicGroup(arity: arity)
-      print(to: &standardError)
-    }
-
-    print("Generating alternation overloads...", to: &standardError)
+      log("")
+    }
+
+    log("Generating alternation overloads...")
     for (leftArity, rightArity) in Permutations(totalArity: maxArity) {
-      print(
-        "  Left arity: \(leftArity)  Right arity: \(rightArity)",
-        to: &standardError)
+      log("  Left arity: \(leftArity)  Right arity: \(rightArity)")
       emitAlternation(leftArity: leftArity, rightArity: rightArity)
     }
 
-    print("Generating 'AlternationBuilder.buildBlock(_:)' overloads...", to: &standardError)
+    log("Generating 'AlternationBuilder.buildBlock(_:)' overloads...")
     for arity in 1...maxArity {
-      print("  Capture arity: \(arity)", to: &standardError)
+      log("  Capture arity: \(arity)")
       emitUnaryAlternationBuildBlock(arity: arity)
     }
 
-    print("Generating 'capture' and 'tryCapture' overloads...", to: &standardError)
+    log("Generating 'capture' and 'tryCapture' overloads...")
     for arity in 0...maxArity {
-      print("  Capture arity: \(arity)", to: &standardError)
+      log("  Capture arity: \(arity)")
       emitCapture(arity: arity)
     }
 


      """)

    print("Generating concatenation overloads...", to: &standardError)
    for (leftArity, rightArity) in Permutations(totalArity: maxArity) {
      guard rightArity != 0 else {
        continue
      }
      print(
        "  Left arity: \(leftArity)  Right arity: \(rightArity)",
        to: &standardError)
      emitConcatenation(leftArity: leftArity, rightArity: rightArity)
    }



    output("// END AUTO-GENERATED CONTENT\n")

    log("Done!")
  }

  func tupleType(arity: Int, genericParameters: () -> String) -> String {
