///|
fn pdf_ccitt_blank_line(columns : Int, whiteval : Int) -> Array[Int] {
  [
    for _ in 0.. whiteval
  ]
}

///|
fn pdf_ccitt_output_span(
  line : Array[Int],
  column : Int,
  length : Int,
  value : Int,
) -> Int raise @core.PdfError {
  if length < 0 || column < 0 || column + length > line.length() {
    raise InvalidCCITTData
  }
  for index in column..<(column + length) {
    line[index] = value
  }
  column + length
}

///|
fn pdf_ccitt_output_line(
  output : @core.BitWriter,
  line : ArrayView[Int],
) -> Unit raise @core.PdfError {
  for bit in line {
    output.put_bit(bit)
  }
  output.align()
}

///|
fn pdf_ccitt_find_value(line : ArrayView[Int], start : Int, value : Int) -> Int {
  let mut position = start
  while position >= 0 && position < line.length() && line[position] != value {
    position += 1
  }
  if position > line.length() {
    line.length()
  } else {
    position
  }
}

///|
fn pdf_ccitt_find_b1(
  reference : ArrayView[Int],
  column : Int,
  white : Bool,
  whiteval : Int,
  blackval : Int,
) -> Int {
  let current = if white { whiteval } else { blackval }
  let opposite = if white { blackval } else { whiteval }
  let mut position = column
  if !(column == 0 && white) {
    position = pdf_ccitt_find_value(reference, position, current)
  }
  pdf_ccitt_find_value(reference, position, opposite)
}

///|
fn pdf_ccitt_find_b2(
  reference : ArrayView[Int],
  column : Int,
  white : Bool,
  whiteval : Int,
  blackval : Int,
) -> Int {
  let current = if white { whiteval } else { blackval }
  let opposite = if white { blackval } else { whiteval }
  let mut position = column
  if !(column == 0 && white) {
    position = pdf_ccitt_find_value(reference, position, current)
  }
  position = pdf_ccitt_find_value(reference, position, opposite)
  pdf_ccitt_find_value(reference, position, current)
}