///|
fn main {
  let tasks : Array[(String, Array[@loom.Example], Array[String])] = [
    (
      "product model",
      [
        { input: ["ACME-0012-red-L"], output: "0012", },
        { input: ["ACME-0081-blue-M"], output: "0081", },
      ],
      ["ACME-123456-green-XL"],
    ),
    (
      "event label",
      [
        { input: ["陈雨", "A1"], output: "A1 / 陈雨", },
        { input: ["王琪", "B12"], output: "B12 / 王琪", },
      ],
      ["赵晨", "C20"],
    ),
    (
      "media date",
      [
        { input: ["采访_20261009_take03.wav"], output: "2026-10-09", },
        { input: ["讲座_20261102_take12.wav"], output: "2026-11-02", },
      ],
      ["纪录片_20240229_take105.wav"],
    ),
  ]
  try {
    for task in tasks {
      let (name, examples, heldout) = task
      let report = @loom.synthesize(examples)
      if report.candidates.is_empty() {
        abort("demo did not find a program")
      }
      let expr = report.candidates[0].expression
      println(name + ": " + @loom.explain(expr))
      println("  held-out output: " + @loom.evaluate(expr, heldout))
      println("  search status: " + report.status)
    }
  } catch {
    @loom.LoomError(message) => abort(message)
  }
}