///|
fn pdf_tree_group_count(length : Int) -> Int {
  if length <= 10 {
    1
  } else if length <= 100 {
    (length + 9) / 10
  } else {
    10
  }
}

///|
fn PdfDocument::pdf_tree_build_name_tree_range(
  self : PdfDocument,
  entries : ArrayView[(@core.PdfBytes, @syntax.PdfObject)],
  start : Int,
  stop : Int,
  is_root : Bool,
) -> @syntax.PdfObject {
  if stop - start <= 10 {
    let items : Array[@syntax.PdfObject] = Array(capacity=(stop - start) * 2)
    for i in start.. @syntax.PdfObject {
  if entries.length() == 0 {
    PdfDictionary([(pdf_tree_names_key(), PdfArray([]))])
  } else {
    let sorted = pdf_tree_sort_name_entries(entries)
    self.pdf_tree_build_name_tree_range(sorted, 0, sorted.length(), true)
  }
}

///|
/// Build either a name tree or a number tree from byte-keyed entries.
///
/// When `is_number` is `false`, this delegates to `build_name_tree`. When it is
/// `true`, keys must be signed 32-bit decimal ASCII and are converted to
/// integers before building a number tree; invalid keys raise `@core.PdfError::NumberExpected`.
pub fn pdf_build_name_tree(
  is_number : Bool,
  document : PdfDocument,
  entries : ArrayView[(@core.PdfBytes, @syntax.PdfObject)],
) -> @syntax.PdfObject raise @core.PdfError {
  if is_number {
    let number_entries : Array[(Int, @syntax.PdfObject)] = Array(
      capacity=entries.length(),
    )
    for entry in entries {
      number_entries.push((pdf_tree_number_key_of_bytes(entry.0), entry.1))
    }
    document.build_number_tree(number_entries)
  } else {
    document.build_name_tree(entries)
  }
}

///|
fn PdfDocument::pdf_tree_build_number_tree_range(
  self : PdfDocument,
  entries : ArrayView[(Int, @syntax.PdfObject)],
  start : Int,
  stop : Int,
  is_root : Bool,
) -> @syntax.PdfObject {
  if stop - start <= 10 {
    let items : Array[@syntax.PdfObject] = Array(capacity=(stop - start) * 2)
    for i in start.. @syntax.PdfObject {
  if entries.length() == 0 {
    PdfDictionary([(pdf_tree_nums_key(), PdfArray([]))])
  } else {
    let sorted = pdf_tree_sort_number_entries(entries)
    self.pdf_tree_build_number_tree_range(sorted, 0, sorted.length(), true)
  }
}