31 lines
785 B
Smalltalk
31 lines
785 B
Smalltalk
Object subclass: MovingAverage [
|
|
|valueCollection period collectedNumber sum|
|
|
MovingAverage class >> newWithPeriod: thePeriod [
|
|
|r|
|
|
r := super basicNew.
|
|
^ r initWithPeriod: thePeriod
|
|
]
|
|
initWithPeriod: thePeriod [
|
|
valueCollection := OrderedCollection new: thePeriod.
|
|
period := thePeriod.
|
|
collectedNumber := 0.
|
|
sum := 0
|
|
]
|
|
sma [ collectedNumber < period
|
|
ifTrue: [ ^ sum / collectedNumber ]
|
|
ifFalse: [ ^ sum / period ] ]
|
|
add: value [
|
|
collectedNumber < period
|
|
ifTrue: [
|
|
sum := sum + value.
|
|
valueCollection add: value.
|
|
collectedNumber := collectedNumber + 1.
|
|
]
|
|
ifFalse: [
|
|
sum := sum - (valueCollection removeFirst).
|
|
sum := sum + value.
|
|
valueCollection add: value
|
|
].
|
|
^ self sma
|
|
]
|
|
].
|