///|
pub(all) enum Center[T] {
  Center(T, width~ : Int, padding~ : Byte)
}

///|
pub impl[T : @fmt.Format] @fmt.Format for Center[T] with write(
  value : Center[T],
  buffer : @fmt.Memory,
  start : Int,
) {
  let Center(value, width~, padding~) = value
  let cnt = @fmt.Format::write(value, buffer, start)
  let padding_len = width - cnt
  if padding_len > 0 {
    let left_padding_len = padding_len / 2
    let right_padding_len = padding_len - left_padding_len
    memory_copy_backward(
      dst=buffer,
      dst_start=start + left_padding_len,
      src=buffer,
      src_start=start,
      len=cnt,
    )
    memory_fill(memory=buffer, start~, len=left_padding_len, value=padding)
    memory_fill(
      memory=buffer,
      start=start + left_padding_len + cnt,
      len=right_padding_len,
      value=padding,
    )
    width
  } else {
    cnt
  }
}

///|
pub impl[T : @fmt.Format] @fmt.Format for Center[T] with count(
  value : Center[T],
) {
  let Center(value, width~, padding~) = value
  let cnt = @fmt.Format::count(value)
  if cnt < width {
    width
  } else {
    cnt
  }
}