let check ec param =
    if ec.assertion param then
      (* assertion succeeded *)
      if ec.num_fail_alerts = 0 then
        (* and it succeeded last time too -- no change *)
        None
      else
        (* it did not succeed last time -- change to success *)
        begin
          ec.num_fail_alerts <- 0;
          Some (ec.success_alert param)
        end
    else
      (* assertion failed *)
      if ec.num_fail_alerts = ec.max_fail_alerts then
        (* we're at max_fail_alerts now *)
        begin
          ec.num_fail_alerts <- ec.num_fail_alerts + 1;
          Some (ec.final_fail_alert param)
        end
      else if ec.num_fail_alerts < ec.max_fail_alerts then
        (* haven't reached max fail alerts yet *)
        begin
          ec.num_fail_alerts <- ec.num_fail_alerts + 1;
          Some (ec.fail_alert param)
        end
      else
        (* we're beyond max_fail_alerts *)
        None