diff --git a/decor/moving-average.go b/decor/moving-average.go index ce2cda7..f9596a2 100644 --- a/decor/moving-average.go +++ b/decor/moving-average.go @@ -15,39 +15,32 @@ Set(float64) } -type median struct { - window [3]float64 - dst []float64 +type medianWindow [3]float64 + +func (s *medianWindow) Len() int { return len(s) } +func (s *medianWindow) Swap(i, j int) { s[i], s[j] = s[j], s[i] } +func (s *medianWindow) Less(i, j int) bool { return s[i] < s[j] } + +func (s *medianWindow) Add(value float64) { + s[0], s[1] = s[1], s[2] + s[2] = value } -type sortable []float64 - -func (s sortable) Len() int { return len(s) } -func (s sortable) Swap(i, j int) { s[i], s[j] = s[j], s[i] } -func (s sortable) Less(i, j int) bool { return s[i] < s[j] } - -func (s *median) Add(v float64) { - s.window[0], s.window[1] = s.window[1], s.window[2] - s.window[2] = v +func (s *medianWindow) Value() float64 { + tmp := *s + sort.Sort(&tmp) + return tmp[1] } -func (s *median) Value() float64 { - copy(s.dst, s.window[:]) - sort.Sort(sortable(s.dst)) - return s.dst[1] -} - -func (s *median) Set(value float64) { - for i, _ := range s.window { - s.window[i] = value +func (s *medianWindow) Set(value float64) { + for i := 0; i < len(s); i++ { + s[i] = value } } // NewMedian is fixed last 3 samples median MovingAverage. func NewMedian() MovingAverage { - return &median{ - dst: make([]float64, 3), - } + return new(medianWindow) } type medianEwma struct { @@ -58,10 +51,10 @@ func (s *medianEwma) Add(v float64) { s.median.Add(v) - s.count++ - if s.count >= 3 { + if s.count >= 2 { s.MovingAverage.Add(s.median.Value()) } + s.count++ } // NewMedianEwma is ewma based MovingAverage, which gets its values from median MovingAverage.