///|
/// Interleaved stereo PCM: the caller advances by the accepted scalar count.
fn run() -> Unit raise {
  let config = @flac.EncoderConfig::new(
    { sample_rate: 48000, channels: 2, bits_per_sample: 24, },
    block_size=16,
    effort=5,
  )
  let pcm = Array::makei(40, i => if i % 2 == 0 { -i * 100 } else { i * 100 })
  let encoder = @flac.Encoder::new(config)
  let mut cursor = 0
  let mut bytes = 0
  while true {
    match encoder.next() {
      EncodedBytes(chunk) =>
        // A non-seekable sink can write this owned chunk immediately.
        bytes += chunk.length()
      NeedPcm =>
        if cursor == pcm.length() {
          encoder.finish()
        } else {
          cursor += encoder.push(pcm[cursor:].to_owned())
        }
      EncoderDone(summary) => {
        // A seekable sink replaces its first header with summary.final_header.
        println(
          "Encoded \{summary.total_samples} stereo frames in \{summary.frames} FLAC frames (\{bytes} bytes)",
        )
        break
      }
    }
  }
  let complete = @flac.encode_pcm(pcm, config)
  println(
    "Whole-file API finalized \{complete.length()} bytes including STREAMINFO MD5",
  )
}

///|
fn main {
  run() catch {
    error => println(error)
  }
}