///|
fn zeros(count : Int) -> Bytes {
  if count <= 0 {
    b""
  } else {
    Bytes::makei(count, fn(_) { b'\x00' })
  }
}

///|
fn slice_bytes(
  input : Bytes,
  start : Int,
  length : Int,
) -> Bytes raise RadiusError {
  if start < 0 || length < 0 || start + length > input.length() {
    raise TooShort
  }
  Bytes::makei(length, fn(index) { input[start + index] })
}

///|
fn byte_eq(left : Bytes, right : Bytes) -> Bool {
  if left.length() != right.length() {
    false
  } else {
    let mut equal = true
    for index = 0; index < left.length(); index = index + 1 {
      if left[index] != right[index] {
        equal = false
      }
    }
    equal
  }
}

///|
fn xor_bytes(left : Bytes, right : Bytes) -> Bytes raise RadiusError {
  if left.length() != right.length() {
    raise InvalidAttribute("xor operands have different lengths")
  }
  Bytes::makei(left.length(), fn(index) {
    (left[index].to_int() ^ right[index].to_int()).to_byte()
  })
}

///|
fn u32_bytes(value : Int) -> Bytes {
  Bytes::makei(4, fn(index) { ((value >> (24 - index * 8)) & 255).to_byte() })
}