///|
fn trace(labels : Array[String]) -> @lens.CaseTrace raise {
  let events = []
  for i, label in labels {
    events.push(
      @lens.LogEvent::new(
        "e\{i}",
        "reference",
        label,
        i.to_int64() * 10L,
        i.to_int64() * 10L + 1L,
      ),
    )
  }
  @lens.CaseTrace::new("reference", events)
}

///|
fn parallel() -> @lens.BpmnModel raise {
  @lens.BpmnModel::new(
    [
      { id: "start", kind: Start, activity: None, },
      { id: "split", kind: Parallel, activity: None, },
      { id: "a", kind: Task, activity: Some("A"), },
      { id: "b", kind: Task, activity: Some("B"), },
      { id: "join", kind: Parallel, activity: None, },
      { id: "end", kind: End, activity: None, },
    ],
    [
      { id: "f0", source: "start", target: "split", },
      { id: "f1", source: "split", target: "a", },
      { id: "f2", source: "split", target: "b", },
      { id: "f3", source: "a", target: "join", },
      { id: "f4", source: "b", target: "join", },
      { id: "f5", source: "join", target: "end", },
    ],
  )
}

///|
fn probe(
  name : String,
  net : @lens.PetriNet,
  maximum_length : Int32,
) -> Unit raise {
  let observations : Array[Json] = []
  for length in 0..<(maximum_length + 1) {
    let mut count = 1
    for _ in 0..