| 22 | 22 |
// work duration as second argument, in order for this decorator to
|
| 23 | 23 |
// work correctly. This decorator is a wrapper of MovingAverageSpeed.
|
| 24 | 24 |
func EwmaSpeed(unit int, format string, age float64, wcc ...WC) Decorator {
|
| 25 | |
return MovingAverageSpeed(unit, format, ewma.NewMovingAverage(age), wcc...)
|
|
25 |
var average MovingAverage
|
|
26 |
if age == 0.0 {
|
|
27 |
average = ewma.NewMovingAverage()
|
|
28 |
} else {
|
|
29 |
average = ewma.NewMovingAverage(age)
|
|
30 |
}
|
|
31 |
return MovingAverageSpeed(unit, format, average, wcc...)
|
| 26 | 32 |
}
|
| 27 | 33 |
|
| 28 | 34 |
// MovingAverageSpeed decorator relies on MovingAverage implementation
|
|
| 53 | 59 |
}
|
| 54 | 60 |
wc.Init()
|
| 55 | 61 |
d := &movingAverageSpeed{
|
| 56 | |
WC: wc,
|
| 57 | |
average: average,
|
| 58 | |
}
|
| 59 | |
switch unit {
|
| 60 | |
case UnitKiB:
|
| 61 | |
d.producer = func(speed float64) string {
|
| 62 | |
return fmt.Sprintf(format, &speedType{SizeB1024(math.Round(speed))})
|
| 63 | |
}
|
| 64 | |
case UnitKB:
|
| 65 | |
d.producer = func(speed float64) string {
|
| 66 | |
return fmt.Sprintf(format, &speedType{SizeB1000(math.Round(speed))})
|
| 67 | |
}
|
| 68 | |
default:
|
| 69 | |
d.producer = func(speed float64) string {
|
| 70 | |
return fmt.Sprintf(format, speed)
|
| 71 | |
}
|
|
62 |
WC: wc,
|
|
63 |
average: average,
|
|
64 |
producer: chooseSpeedProducer(unit, format),
|
| 72 | 65 |
}
|
| 73 | 66 |
return d
|
| 74 | 67 |
}
|
|
| 146 | 139 |
d := &averageSpeed{
|
| 147 | 140 |
WC: wc,
|
| 148 | 141 |
startTime: startTime,
|
| 149 | |
}
|
| 150 | |
switch unit {
|
| 151 | |
case UnitKiB:
|
| 152 | |
d.producer = func(speed float64) string {
|
| 153 | |
return fmt.Sprintf(format, &speedType{SizeB1024(math.Round(speed))})
|
| 154 | |
}
|
| 155 | |
case UnitKB:
|
| 156 | |
d.producer = func(speed float64) string {
|
| 157 | |
return fmt.Sprintf(format, &speedType{SizeB1000(math.Round(speed))})
|
| 158 | |
}
|
| 159 | |
default:
|
| 160 | |
d.producer = func(speed float64) string {
|
| 161 | |
return fmt.Sprintf(format, speed)
|
| 162 | |
}
|
|
142 |
producer: chooseSpeedProducer(unit, format),
|
| 163 | 143 |
}
|
| 164 | 144 |
return d
|
| 165 | 145 |
}
|
|
| 193 | 173 |
func (d *averageSpeed) AverageAdjust(startTime time.Time) {
|
| 194 | 174 |
d.startTime = startTime
|
| 195 | 175 |
}
|
|
176 |
|
|
177 |
func chooseSpeedProducer(unit int, format string) func(float64) string {
|
|
178 |
switch unit {
|
|
179 |
case UnitKiB:
|
|
180 |
return func(speed float64) string {
|
|
181 |
return fmt.Sprintf(format, &speedType{SizeB1024(math.Round(speed))})
|
|
182 |
}
|
|
183 |
case UnitKB:
|
|
184 |
return func(speed float64) string {
|
|
185 |
return fmt.Sprintf(format, &speedType{SizeB1000(math.Round(speed))})
|
|
186 |
}
|
|
187 |
default:
|
|
188 |
return func(speed float64) string {
|
|
189 |
return fmt.Sprintf(format, speed)
|
|
190 |
}
|
|
191 |
}
|
|
192 |
}
|