///|
fn read_interleaved(
  r : Reader,
  channels : Array[(Int32, RawIndex)],
  state : ReadState,
) -> Unit raise TdmsError {
  if channels.is_empty() {
    return
  }
  let count = channels[0].1.count
  for (_, idx) in channels {
    if idx.kind == Text {
      raise Unsupported("interleaved string channels")
    }
    demand(idx.count == count, "unequal interleaved channel lengths")
  }
  for row = 0; row < count; row = row + 1 {
    for (i, idx) in channels {
      state.doc.objects[i].values.push(r.scalar(idx.kind))
    }
  }
}

///|
pub fn write_interleaved(
  doc : Document,
  big_endian~ : Bool = false,
  limits~ : Limits = Limits::default(),
) -> Bytes raise TdmsError {
  doc.validate(limits)
  let channels = doc.objects.filter(o => o.kind is Some(_))
  let count = if channels.is_empty() { 0 } else { channels[0].values.length() }
  for obj in channels {
    if obj.kind == Some(Text) {
      raise Unsupported("interleaved string channels")
    }
    demand(obj.values.length() == count, "unequal interleaved channel lengths")
  }
  let ordinary = write(doc, big_endian~, limits~)
  let seg = inspect(ordinary, limits~)[0]
  let out = Writer::new(false, limits)
  out.append(b"TDSm")
  out.uint((seg.toc | 32U).to_uint64(), 4)
  out.append(Bytes::makei(seg.raw_offset - 8, i => ordinary[i + 8]))
  let raw = Writer::new(big_endian, limits)
  for row = 0; row < count; row = row + 1 {
    for obj in channels {
      raw.scalar(obj.kind.unwrap(), obj.values[row])
    }
  }
  out.append(raw.finish())
  out.finish()
}