///|
pub(all) struct Student {
  id : String
  score : Double
}

///|
pub(all) enum ExamResult {
  Pass
  Fail
} derive(Debug)

///|
pub impl Eq for ExamResult with fn equal(self, other) {
  match (self, other) {
    (Pass, Pass) | (Fail, Fail) => true
    _ => false
  }
}

///|
pub fn is_qualified(student : Student, criteria : Double) -> ExamResult {
  if student.score >= criteria {
    Pass
  } else {
    Fail
  }
}

///|
pub fn count_qualified_students(
  students : Array[Student],
  is_qualified : (Student) -> ExamResult,
) -> Int {
  let mut count = 0
  for s in students {
    if is_qualified(s) == Pass {
      count += 1
    }
  }
  count
}