///|
fn pdf_spot_name(text : String) -> PdfName {
  pdf_name_of_bytes(@ascii.encode(text))
}

///|
let pdf_spot_separation_name : PdfName = pdf_spot_name("/Separation")

///|
fn pdf_spot_separation() -> PdfName {
  pdf_spot_separation_name
}

///|
fn pdf_spot_colour_of_object(
  document : PdfDocument,
  object : PdfObject,
) -> PdfName? {
  match object {
    PdfArray([PdfNameObject(kind), colourant, ..]) if kind ==
      pdf_spot_separation() =>
      match document.direct(colourant) {
        PdfNameObject(name) => Some(name)
        _ => None
      }
    _ => None
  }
}

///|
/// Return spot colourant names from top-level `/Separation` colour-space objects.
///
/// This follows cpdf's `list_spot_colours` scan: it iterates document objects
/// and reports arrays whose first entry is `/Separation`; nested arrays inside
/// dictionaries are not recursively scanned by this helper.
pub fn PdfDocument::list_spot_colours(self : PdfDocument) -> Array[PdfName] {
  let colours : Array[PdfName] = []
  for entry in self.parsed_object_entries() {
    match pdf_spot_colour_of_object(self, entry.2) {
      Some(name) => colours.push(name)
      None => ()
    }
  }
  colours
}

///|
/// Compatibility wrapper for `PdfDocument::list_spot_colours`.
pub fn pdf_list_spot_colours(document : PdfDocument) -> Array[PdfName] {
  document.list_spot_colours()
}