@@ -51,7 +51,8 @@ object AveragedGroup extends Group[AveragedValue] {
51
51
* Note that n must be >= k.
52
52
*/
53
53
private def stableAverage (n : Long , an : Double , k : Long , ak : Double ): Double =
54
- (n + k) match {
54
+ if (n < k) stableAverage(k, ak, n, an)
55
+ else (n + k) match {
55
56
case 0L => 0.0
56
57
case newCount if (newCount == n) => an
57
58
case newCount =>
@@ -74,27 +75,18 @@ object AveragedGroup extends Group[AveragedValue] {
74
75
var average = 0.0
75
76
iter.foreach {
76
77
case AveragedValue (c, v) =>
77
- average =
78
- if (count >= c) stableAverage(count, average, c, v)
79
- else stableAverage(c, v, count, average)
78
+ average = stableAverage(count, average, c, v)
80
79
count += c
81
80
}
82
81
Some (AveragedValue (count, average))
83
82
}
84
83
85
- def plus (big : AveragedValue , small : AveragedValue ): AveragedValue =
86
- if (big.count < small.count) plus(small, big)
87
- else {
88
- val n = big.count
89
- val k = small.count
90
- (n + k) match {
91
- case 0L => zero
92
- case newCount if (newCount == n) => big
93
- case newCount =>
94
- val newAve = stableAverage(big.count, big.value, small.count, small.value)
95
- AveragedValue (newCount, newAve)
96
- }
97
- }
84
+ def plus (big : AveragedValue , small : AveragedValue ): AveragedValue = {
85
+ val n = big.count
86
+ val k = small.count
87
+ val newAve = stableAverage(n, big.value, k, small.value)
88
+ AveragedValue (n + k, newAve)
89
+ }
98
90
}
99
91
100
92
object Averager extends MonoidAggregator [Double , AveragedValue , Double ] {
0 commit comments