///|
pub fn lint_report(
  index : @semantic.SemanticIndex,
  config : LintConfig,
) -> @diagnostic.DiagnosticReport {
  @diagnostic.DiagnosticReport::new(run(index, config))
}

///|
pub fn lint_codes(
  index : @semantic.SemanticIndex,
  config : LintConfig,
) -> Array[String] {
  lint_report(index, config).codes()
}

///|
pub fn lint_has_errors(
  index : @semantic.SemanticIndex,
  config : LintConfig,
) -> Bool {
  lint_report(index, config).has_errors()
}

///|
pub fn lint_by_category(
  index : @semantic.SemanticIndex,
  config : LintConfig,
  category : RuleCategory,
) -> @diagnostic.DiagnosticReport {
  let diagnostics = run(index, config)
  let codes = category_codes(category)
  @diagnostic.DiagnosticReport::new(
    @diagnostic.filter_codes(diagnostics, codes),
  )
}

///|
pub fn lint_report_summary(
  index : @semantic.SemanticIndex,
  config : LintConfig,
) -> String {
  lint_report(index, config).summary() + ", " + lint_category_summary(config)
}

///|
pub fn strict_config() -> LintConfig {
  default_config().warnings_as_errors(true)
}

///|
pub fn compare_configs(
  index : @semantic.SemanticIndex,
  first : LintConfig,
  second : LintConfig,
) -> (Int, Int) {
  (lint_report(index, first).total(), lint_report(index, second).total())
}