///|
/// Only frames of stripes intersecting a requested byte range are fetched.
fn main raise {
  let codec = try! @lib.Codec::new(4, 2)
  let input = b"0123456789abcdefghijKLMNOPQRSTuvwxyz"
  let object = try! @lib.encode_object(
    codec,
    input,
    66,
    stripe_payload_limit=10,
  )
  let first = 8
  let length = 17
  let first_stripe = first / object.manifest().stripe_payload_limit()
  let last_stripe = (first + length - 1) /
    object.manifest().stripe_payload_limit()
  let fetched : Array[@lib.ShardEnvelope] = []
  for frame in object.frames() {
    if frame.stripe_index() >= first_stripe &&
      frame.stripe_index() <= last_stripe &&
      frame.shard_index() != 1 {
      fetched.push(frame)
    }
  }
  let slice = try! @lib.recover_object_range(
    object.manifest(),
    fetched,
    first,
    length,
  )
  assert_eq(slice, Bytes::from_array(input[first:first + length].to_array()))
  println("fetched frames: " + fetched.length().to_string())
  println("partial object read: ok")
}