///|
/// Mutable set of PDF object numbers used to de-duplicate traversal results.
pub struct PdfNumberSet {
  values : @hashmap.HashMap[Int, Bool]
}

///|
/// Build a number set pre-populated with the given object numbers.
pub fn pdf_number_set(numbers : ArrayView[Int]) -> PdfNumberSet {
  let values : @hashmap.HashMap[Int, Bool] = HashMap([])
  for number in numbers {
    values[number] = true
  }
  { values, }
}

///|
/// Return whether the set already contains `number`.
pub fn PdfNumberSet::contains(self : PdfNumberSet, number : Int) -> Bool {
  self.values.contains(number)
}

///|
/// Add `number` to the set.
pub fn PdfNumberSet::add(self : PdfNumberSet, number : Int) -> Unit {
  self.values[number] = true
}

///|
/// Push `number` into `numbers` only when it has not been seen before.
pub fn pdf_push_unique_number(
  numbers : Array[Int],
  seen : PdfNumberSet,
  number : Int,
) -> Unit {
  if !seen.contains(number) {
    numbers.push(number)
    seen.add(number)
  }
}