///|
/// Runnable demo for the FLAC decoder: decode two embedded streams — a mono
/// one and a mid+side stereo one — and print their stream properties and the
/// first few decoded samples.
///
/// Run with: `moon run cmd/main`

// A 16-sample mono FLAC file (44100 Hz, 16-bit), all samples verbatim.
let mono : Bytes =
  b"\x66\x4c\x61\x43\x80\x00\x00\x22\x00\x10\x00\x10\x00\x00\x00\x00\x00\x00\x0a\xc4\x40\xf0\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf8\x69\x08\x00\x0f\x30\x02\x00\x00\x00\x64\xff\x9c\x00\xc8\xff\x38\x01\xf4\xfe\x0c\x03\xe8\xfc\x18\x07\xd0\xf8\x30\x13\x88\xec\x78\x27\x10\xd8\xf0\x30\x39\xa0\x5e"

// A 16-sample stereo FLAC file (44100 Hz, 16-bit) stored as mid+side.
let stereo : Bytes =
  b"\x66\x4c\x61\x43\x80\x00\x00\x22\x00\x10\x00\x10\x00\x00\x00\x00\x00\x00\x0a\xc4\x42\xf0\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xf8\x69\xa8\x00\x0f\x78\x02\x00\x05\x00\x09\x00\x10\x00\x12\x00\x1b\x00\x1b\x00\x26\x00\x24\x00\x31\x00\x2d\x00\x3c\x00\x36\x00\x47\x00\x3f\x00\x52\x00\x48\x02\x00\x09\x00\x16\x00\x1b\x00\x2c\x00\x2d\x00\x42\x00\x3f\x00\x58\x00\x51\x00\x6e\x00\x63\x00\x84\x00\x75\x00\x9a\x00\x87\x00\xb0\x12\xd6"

fn main {
  show("mono (verbatim)", mono)
  show("stereo (mid+side)", stereo)
}

fn show(label : String, flac : Bytes) -> Unit {
  let pcm = try {
    @lib.decode(flac) |> Some
  } catch {
    _ => None
  }
  match pcm {
    None => println("\{label}: decode failed")
    Some(p) => {
      println("== \{label} ==")
      println("  sample rate : \{p.sample_rate} Hz")
      println("  channels    : \{p.channels}")
      println("  bits        : \{p.bits_per_sample}")
      println("  samples     : \{p.samples.length()}")
      let n = if p.samples.length() < 8 { p.samples.length() } else { 8 }
      let mut first = "  first 8     :"
      for i in 0..