///|
fn main {
  let c = @tide.config(@tide.Session(gap=10), lateness=20) catch {
    _ => abort("invalid demo configuration")
  }
  let e = @tide.Engine::new(c) catch { _ => abort("cannot initialize demo") }
  let commands : Array[@tide.Command] = [
    @tide.Transact(id="seed", changes=[
      @tide.Put({ id: "left", key: "device-A", at: 0, value: 20, fields: None, }),
      @tide.Put({
        id: "right",
        key: "device-A",
        at: 16,
        value: 35,
        fields: None,
      }),
    ]),
    @tide.Transact(id="late-bridge", changes=[
      @tide.Put({
        id: "bridge",
        key: "device-A",
        at: 8,
        value: 12,
        fields: None,
      }),
    ]),
    @tide.Transact(id="retract-bridge", changes=[@tide.Remove("bridge")]),
    @tide.Advance(id="finalize", to=60),
    @tide.Transact(id="blocked-correction", changes=[@tide.Remove("left")]),
    @tide.Forget(id="freeze", to=60),
    @tide.Transact(id="sealed-correction", changes=[@tide.Remove("left")]),
  ]
  for c in commands {
    let o = e.apply(c)
    println(
      "\{o.id}: \{o.status}; deltas=\{o.deltas.length()}; rows=\{e.rows().length()}",
    )
  }
  println("frozen=\{e.frozen_count()}, active=\{e.events().length()}")
  let restored = @tide.restore(e.checkpoint()) catch {
    _ => abort("checkpoint restore failed")
  }
  println(
    "restored version=\{restored.version()}, watermark=\{restored.watermark()}",
  )
}