///|
pub struct Enumeration[P] {
  priv candidates : Array[P]
  priv mut index : Int32
}

///|
pub fn[P] Enumeration::new(candidates : Array[P]) -> Enumeration[P] {
  { candidates: candidates.copy(), index: 0, }
}

///|
pub fn[P] Enumeration::next(self : Enumeration[P]) -> P? {
  if self.index >= self.candidates.length() {
    return None
  }
  let candidate = self.candidates[self.index]
  self.index += 1
  Some(candidate)
}