diff --git a/decor/eta.go b/decor/eta.go index f270c85..00ef8c9 100644 --- a/decor/eta.go +++ b/decor/eta.go @@ -55,7 +55,7 @@ WC: wc, average: average, normalizer: normalizer, - producer: chooseProducer(style), + producer: chooseEtaProducer(style), } return d } @@ -122,7 +122,7 @@ d := &averageETA{ WC: wc, startTime: startTime, - producer: chooseProducer(style), + producer: chooseEtaProducer(style), } return d } @@ -192,7 +192,7 @@ }) } -func chooseProducer(style TimeStyle) func(time.Duration) string { +func chooseEtaProducer(style TimeStyle) func(time.Duration) string { switch style { case ET_STYLE_HHMMSS: return func(remaining time.Duration) string { diff --git a/decor/speed.go b/decor/speed.go index f743766..6ecdd58 100644 --- a/decor/speed.go +++ b/decor/speed.go @@ -23,7 +23,13 @@ // work duration as second argument, in order for this decorator to // work correctly. This decorator is a wrapper of MovingAverageSpeed. func EwmaSpeed(unit int, format string, age float64, wcc ...WC) Decorator { - return MovingAverageSpeed(unit, format, ewma.NewMovingAverage(age), wcc...) + var average MovingAverage + if age == 0.0 { + average = ewma.NewMovingAverage() + } else { + average = ewma.NewMovingAverage(age) + } + return MovingAverageSpeed(unit, format, average, wcc...) } // MovingAverageSpeed decorator relies on MovingAverage implementation @@ -54,22 +60,9 @@ } wc.Init() d := &movingAverageSpeed{ - WC: wc, - average: average, - } - switch unit { - case UnitKiB: - d.producer = func(speed float64) string { - return fmt.Sprintf(format, &speedType{SizeB1024(math.Round(speed))}) - } - case UnitKB: - d.producer = func(speed float64) string { - return fmt.Sprintf(format, &speedType{SizeB1000(math.Round(speed))}) - } - default: - d.producer = func(speed float64) string { - return fmt.Sprintf(format, speed) - } + WC: wc, + average: average, + producer: chooseSpeedProducer(unit, format), } return d } @@ -147,20 +140,7 @@ d := &averageSpeed{ WC: wc, startTime: startTime, - } - switch unit { - case UnitKiB: - d.producer = func(speed float64) string { - return fmt.Sprintf(format, &speedType{SizeB1024(math.Round(speed))}) - } - case UnitKB: - d.producer = func(speed float64) string { - return fmt.Sprintf(format, &speedType{SizeB1000(math.Round(speed))}) - } - default: - d.producer = func(speed float64) string { - return fmt.Sprintf(format, speed) - } + producer: chooseSpeedProducer(unit, format), } return d } @@ -194,3 +174,20 @@ func (d *averageSpeed) AverageAdjust(startTime time.Time) { d.startTime = startTime } + +func chooseSpeedProducer(unit int, format string) func(float64) string { + switch unit { + case UnitKiB: + return func(speed float64) string { + return fmt.Sprintf(format, &speedType{SizeB1024(math.Round(speed))}) + } + case UnitKB: + return func(speed float64) string { + return fmt.Sprintf(format, &speedType{SizeB1000(math.Round(speed))}) + } + default: + return func(speed float64) string { + return fmt.Sprintf(format, speed) + } + } +}