diff --git a/bar.go b/bar.go index f364b46..de6c89c 100644 --- a/bar.go +++ b/bar.go @@ -78,6 +78,7 @@ mDecorators []decor.Decorator amountReceivers []decor.AmountReceiver shutdownListeners []decor.ShutdownListener + averageAdjusters []decor.AverageAdjuster bufP, bufB, bufA *bytes.Buffer bufE *bytes.Buffer @@ -186,18 +187,15 @@ // AdjustAverageDecorators updates start time of all average decorators. // Useful for resume-able tasks. func (b *Bar) AdjustAverageDecorators(startTime time.Time) { - type adjustable interface { - AverageAdjust(time.Time) - } - b.UpdateDecorators(func(d decor.Decorator) { - if d, ok := d.(adjustable); ok { - d.AverageAdjust(startTime) - } - }) -} - -// UpdateDecorators general helper func. -func (b *Bar) UpdateDecorators(cb decor.UpdateFunc) { + b.operateState <- func(s *bState) { + for _, adjuster := range s.averageAdjusters { + adjuster.AverageAdjust(startTime) + } + } +} + +// TraverseDecorators traverses all available decorators and calls cb func on each. +func (b *Bar) TraverseDecorators(cb decor.CBFunc) { b.operateState <- func(s *bState) { for _, decorators := range [...][]decor.Decorator{ s.pDecorators, diff --git a/decor/decorator.go b/decor/decorator.go index 92c8e49..2f941d7 100644 --- a/decor/decorator.go +++ b/decor/decorator.go @@ -93,10 +93,17 @@ Shutdown() } -// UpdateFunc convenience func type -type UpdateFunc func(Decorator) +// AverageAdjuster interface. +// Average decorators should implement this interface to provide start +// time adjustment facility, for resume-able tasks. +type AverageAdjuster interface { + AverageAdjust(time.Time) +} -// Global convenience shortcuts +// CBFunc convenience call back func type. +type CBFunc func(Decorator) + +// Global convenience instances of WC with sync width bit set. var ( WCSyncWidth = WC{C: DSyncWidth} WCSyncWidthR = WC{C: DSyncWidthR} diff --git a/progress.go b/progress.go index 6bd49e1..c01e5ca 100644 --- a/progress.go +++ b/progress.go @@ -146,18 +146,23 @@ }: var amountReceivers []decor.AmountReceiver var shutdownListeners []decor.ShutdownListener + var averageAdjusters []decor.AverageAdjuster bar := <-result - bar.UpdateDecorators(func(d decor.Decorator) { + bar.TraverseDecorators(func(d decor.Decorator) { if d, ok := d.(decor.AmountReceiver); ok { amountReceivers = append(amountReceivers, d) } if d, ok := d.(decor.ShutdownListener); ok { shutdownListeners = append(shutdownListeners, d) + } + if d, ok := d.(decor.AverageAdjuster); ok { + averageAdjusters = append(averageAdjusters, d) } }) bar.operateState <- func(s *bState) { s.amountReceivers = amountReceivers s.shutdownListeners = shutdownListeners + s.averageAdjusters = averageAdjusters } return bar case <-p.done: