/
blkaverage.go
49 lines (36 loc) · 862 Bytes
/
blkaverage.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package aggregator
import "sync"
type BlockAverage struct {
windowSize int
values []float64
nextValueIdx int
mutex *sync.Mutex
}
func init() {
RegisterFactory("block_avg", NewBlockAverage)
}
func (ba *BlockAverage) Add(value float64) (bool, float64) {
ba.mutex.Lock()
defer ba.mutex.Unlock()
ba.values[ba.nextValueIdx] = value
ba.nextValueIdx = ba.nextValueIdx + 1
if ba.nextValueIdx >= ba.windowSize {
return true, ba.average()
}
return false, 0
}
func (ba *BlockAverage) average() float64 {
var total = float64(0)
for i := 0; i < ba.windowSize; i++ {
total += ba.values[i]
}
ba.nextValueIdx = 0
return total / float64(ba.windowSize)
}
func NewBlockAverage(windowSize int) Aggregator {
return &BlockAverage{
windowSize: windowSize,
values: make([]float64, windowSize),
mutex: &sync.Mutex{},
}
}