///|
fn time_value(x : @s.Instant?) -> Json {
  match x {
    Some(t) => t.unix_ms().to_json()
    None => (None : Double?).to_json()
  }
}

///|
fn main {
  for q in queries {
    let d = @s.instant(q.0).unwrap()
    let s = @s.observer(q.1, q.2).unwrap()
    let sp = @s.sun_position(d, s)
    let mp = @s.moon_position(d, s)
    let il = @s.moon_illumination(d)
    let st = @s.sun_times(d, s)
    let mt = @s.moon_times(d, s)
    let row : Array[Json] = [
      sp.azimuth.to_json(),
      sp.altitude.to_json(),
      mp.azimuth.to_json(),
      mp.altitude.to_json(),
      mp.distance.to_json(),
      il.fraction.to_json(),
      st.solar_noon.unix_ms().to_json(),
      time_value(st.event("sunrise")),
      time_value(st.event("sunset")),
      time_value(st.event("dawn")),
      time_value(st.event("dusk")),
      time_value(mt.rise),
      time_value(mt.set),
    ]
    println(row.to_json().stringify())
  }
}