///|
fn main raise {
  let pattern = @cep.Pattern::new(
    "failed-then-success",
    [
      @cep.Stage::new("failures", @cep.Kind("login_failed"), min=3, max=3),
      @cep.Stage::new("success", @cep.Kind("login_success")),
    ],
    300000L,
    after_match=@cep.SkipPastLast,
  )
  let engine = @cep.Engine::new([pattern])
  // One user's events cannot complete another user's sequence.
  let events = [
    @cep.Event::new("f1", "user/alex", 1000L, "login_failed"),
    @cep.Event::new("other", "user/sam", 2000L, "login_success"),
    @cep.Event::new("f2", "user/alex", 3000L, "login_failed"),
    @cep.Event::new("f3", "user/alex", 4000L, "login_failed"),
    @cep.Event::new("s1", "user/alex", 5000L, "login_success"),
  ]
  ignore(engine.push_many(events))
  let batch = engine.finish()
  assert_eq(batch.matches().length(), 1)
  let found = batch.matches()[0]
  assert_eq(found.events("failures").length(), 3)
  assert_eq(found.key(), "user/alex")
  println(
    "login signal: \{found.key()} failed=\{found.events("failures").length()} success=\{found.events("success")[0].id()}",
  )
  println(@cep.match_to_json(found).stringify())
}