///|
fn main {
  let series = @signal.Series::new("demo", [
    @signal.Sample::new(0, 10.0),
    @signal.Sample::new(1, 12.0),
    @signal.Sample::new(2, 9.0),
    @signal.Sample::new(3, 30.0),
    @signal.Sample::new(4, 11.0),
  ])
  println(series.summary_json())
  println("peaks=\{series.peak_count(20.0)}")
  println("outliers=\{series.outliers(1.5).length()}")
  let window = @signal.RollingWindow::new(3)
  let median = @signal.MedianFilter::new(3)
  let stats = @signal.OnlineMoments::new()
  let detector = @signal.CusumDetector::new(10.0, 0.25, 4.0)
  for i = 0; i < series.samples.length(); i = i + 1 {
    let sample = series.samples[i]
    stats.push(sample.value)
    let cleaned = median.push(sample)
    window.push(cleaned)
    match detector.push(cleaned) {
      Some(change) => println(change.to_json())
      None => ()
    }
  }
  println("stream_mean=\{stats.mean}")
  println("recent_median=\{window.median()} recent_p95=\{window.quantile(950)}")
  println(series.to_csv())
}