///|
/// The byte offset of the first invalid UTF-8 sequence in `bytes`, or its
/// length when there is none.
fn utf8_error_offset(bytes : Bytes) -> Int32 {
  let mut i = 0
  while i < bytes.length() {
    let b = bytes[i].to_int()
    let len = if b < 0x80 {
      1
    } else if b >= 0xC2 && b <= 0xDF {
      2
    } else if b >= 0xE0 && b <= 0xEF {
      3
    } else if b >= 0xF0 && b <= 0xF4 {
      4
    } else {
      return i
    }
    if i + len > bytes.length() {
      return i
    }
    try @utf8.decode(bytes[i:i + len]) catch {
      _ => return i
    } noraise {
      _ => ()
    }
    i += len
  }
  i
}