From f6809a20e691c1dab0d0a74ea1d7d16f64eb6620 Mon Sep 17 00:00:00 2001 From: "didier.amyot" Date: Tue, 13 May 2014 20:59:51 -0400 Subject: [PATCH] started the stats module --- stats.go | 41 +++++++++++++++++++++++++++++++++++++++++ stats_test.go | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) create mode 100644 stats.go create mode 100644 stats_test.go diff --git a/stats.go b/stats.go new file mode 100644 index 0000000..b90f015 --- /dev/null +++ b/stats.go @@ -0,0 +1,41 @@ +package main + +import ( + "fmt" +) + +var _ = fmt.Print + +const initialLength int = 1024 +const verySmall float64 = -100000 +const veryBig float64 = 100000 + +type StatAggregator struct { + sum float64 + sumOfTheSquares float64 + n int + histogram []float64 + min float64 + max float64 +} + +type Stats struct{} + +func NewStatAggregator() *StatAggregator { + return &StatAggregator{0, 0, 0, make([]float64, initialLength), veryBig, verySmall} +} + +func (this *StatAggregator) AddStats(dataChannel chan float64, output chan *Stats) { + for datum := range dataChannel { + this.sum += datum + this.sumOfTheSquares += datum * datum + this.n += 1 + if datum < this.min { + this.min = datum + } + if datum > this.max { + this.max = datum + } + } + output <- nil +} diff --git a/stats_test.go b/stats_test.go new file mode 100644 index 0000000..c10951e --- /dev/null +++ b/stats_test.go @@ -0,0 +1,35 @@ +package main + +import ( + "testing" +) + +func TestNewStats(t *testing.T) { + s := NewStatAggregator() + if s.n != 0 || + s.sum != 0 || + s.sumOfTheSquares != 0 || + len(s.histogram) != initialLength || + s.min != veryBig || + s.max != verySmall { + t.Fail() + } +} + +func TestAddStatsBasic(t *testing.T) { + + numbers := []float64{-1, 1, 20, 3} + c := make(chan float64) + o := make(chan *Stats) + s := NewStatAggregator() + go s.AddStats(c, o) + for _, n := range numbers { + c <- n + } + close(c) + <-o + if s.n != 4. || s.min != -1. || s.max != 20. || s.sum != 23. || s.sumOfTheSquares != 411. { + t.Error(">>>", s.max, s.min) + } + +}