Codebase list golang-github-vbauerster-mpb / c15cd9d
AdjustAverageDecorators for resume-able tasks Vladimir Bauer 6 years ago
6 changed file(s) with 98 addition(s) and 24 deletion(s). Raw diff Collapse all Expand all
7474 noPop bool
7575 aDecorators []decor.Decorator
7676 pDecorators []decor.Decorator
77 mDecorators []decor.Decorator
7778 amountReceivers []decor.AmountReceiver
7879 shutdownListeners []decor.ShutdownListener
7980 bufP, bufB, bufA *bytes.Buffer
169170 }
170171
171172 // SetRefill sets refill, if supported by underlying Filler.
173 // Useful for resume-able tasks.
172174 func (b *Bar) SetRefill(amount int64) {
175 type refiller interface {
176 SetRefill(int64)
177 }
173178 b.operateState <- func(s *bState) {
174 if f, ok := s.filler.(interface{ SetRefill(int64) }); ok {
179 if f, ok := s.filler.(refiller); ok {
175180 f.SetRefill(amount)
181 }
182 }
183 }
184
185 // AdjustAverageDecorators updates start time of all average decorators.
186 // Useful for resume-able tasks.
187 func (b *Bar) AdjustAverageDecorators(startTime time.Time) {
188 type adjustable interface {
189 AverageAdjust(time.Time)
190 }
191 b.UpdateDecorators(func(d decor.Decorator) {
192 if d, ok := d.(adjustable); ok {
193 d.AverageAdjust(startTime)
194 }
195 })
196 }
197
198 // UpdateDecorators general helper func.
199 func (b *Bar) UpdateDecorators(cb decor.UpdateFunc) {
200 b.operateState <- func(s *bState) {
201 for _, decorators := range [...][]decor.Decorator{
202 s.pDecorators,
203 s.aDecorators,
204 s.mDecorators,
205 } {
206 for _, d := range decorators {
207 cb(d)
208 }
176209 }
177210 }
178211 }
66 // BarOption is a function option which changes the default behavior of a bar.
77 type BarOption func(*bState)
88
9 type merger interface {
10 CompoundDecorators() []decor.Decorator
11 }
12
13 func (s *bState) appendAmountReceiver(d decor.Decorator) {
14 if ar, ok := d.(decor.AmountReceiver); ok {
15 s.amountReceivers = append(s.amountReceivers, ar)
16 }
17 }
18
19 func (s *bState) appendShutdownListener(d decor.Decorator) {
20 if sl, ok := d.(decor.ShutdownListener); ok {
21 s.shutdownListeners = append(s.shutdownListeners, sl)
22 }
9 type mergeWrapper interface {
10 MergeUnwrap() []decor.Decorator
2311 }
2412
2513 func (s *bState) addDecorators(dest *[]decor.Decorator, decorators ...decor.Decorator) {
2614 for _, decorator := range decorators {
27 s.appendAmountReceiver(decorator)
28 s.appendShutdownListener(decorator)
29 if m, ok := decorator.(merger); ok {
30 dd := m.CompoundDecorators()
31 s.appendAmountReceiver(dd[0])
32 s.appendShutdownListener(dd[0])
15 if mw, ok := decorator.(mergeWrapper); ok {
16 dd := mw.MergeUnwrap()
17 s.mDecorators = append(s.mDecorators, dd[0])
3318 *dest = append(*dest, dd[1:]...)
3419 }
3520 *dest = append(*dest, decorator)
9292 Shutdown()
9393 }
9494
95 // UpdateFunc convenience func type
96 type UpdateFunc func(Decorator)
97
9598 // Global convenience shortcuts
9699 var (
97100 WCSyncWidth = WC{C: DSyncWidth}
119119 //
120120 // `wcc` optional WC config
121121 func AverageETA(style TimeStyle, wcc ...WC) Decorator {
122 return NewAverageETA(style, time.Now(), wcc...)
123 }
124
125 // NewAverageETA decorator with user provided start time.
126 //
127 // `style` one of [ET_STYLE_GO|ET_STYLE_HHMMSS|ET_STYLE_HHMM|ET_STYLE_MMSS]
128 //
129 // `startTime` start time
130 //
131 // `wcc` optional WC config
132 func NewAverageETA(style TimeStyle, startTime time.Time, wcc ...WC) Decorator {
122133 var wc WC
123134 for _, widthConf := range wcc {
124135 wc = widthConf
127138 d := &averageETA{
128139 WC: wc,
129140 style: style,
130 startTime: time.Now(),
141 startTime: startTime,
131142 }
132143 return d
133144 }
177188 d.completeMsg = &msg
178189 }
179190
191 func (d *averageETA) AverageAdjust(startTime time.Time) {
192 d.startTime = startTime
193 }
194
180195 func MaxTolerateTimeNormalizer(maxTolerate time.Duration) TimeNormalizer {
181196 var normalized time.Duration
182197 var lastCall time.Time
219219 //
220220 // "%.1f" = "1.0MiB/s" or "% .1f" = "1.0 MiB/s"
221221 func AverageSpeed(unit int, unitFormat string, wcc ...WC) Decorator {
222 return NewAverageSpeed(unit, unitFormat, time.Now(), wcc...)
223 }
224
225 // NewAverageSpeed decorator with dynamic unit measure adjustment and
226 // user provided start time.
227 //
228 // `unit` one of [0|UnitKiB|UnitKB] zero for no unit
229 //
230 // `unitFormat` printf compatible verb for value, like "%f" or "%d"
231 //
232 // `startTime` start time
233 //
234 // `wcc` optional WC config
235 //
236 // unitFormat example if UnitKiB is chosen:
237 //
238 // "%.1f" = "1.0MiB/s" or "% .1f" = "1.0 MiB/s"
239 func NewAverageSpeed(unit int, unitFormat string, startTime time.Time, wcc ...WC) Decorator {
222240 var wc WC
223241 for _, widthConf := range wcc {
224242 wc = widthConf
228246 WC: wc,
229247 unit: unit,
230248 unitFormat: unitFormat,
231 startTime: time.Now(),
249 startTime: startTime,
232250 }
233251 return d
234252 }
268286 func (d *averageSpeed) OnCompleteMessage(msg string) {
269287 d.completeMsg = &msg
270288 }
289
290 func (d *averageSpeed) AverageAdjust(startTime time.Time) {
291 d.startTime = startTime
292 }
1010 "time"
1111
1212 "github.com/vbauerster/mpb/v4/cwriter"
13 "github.com/vbauerster/mpb/v4/decor"
1314 )
1415
1516 const (
142143 ps.idCount++
143144 result <- bar
144145 }:
145 return <-result
146 var amountReceivers []decor.AmountReceiver
147 var shutdownListeners []decor.ShutdownListener
148 bar := <-result
149 bar.UpdateDecorators(func(d decor.Decorator) {
150 if d, ok := d.(decor.AmountReceiver); ok {
151 amountReceivers = append(amountReceivers, d)
152 }
153 if d, ok := d.(decor.ShutdownListener); ok {
154 shutdownListeners = append(shutdownListeners, d)
155 }
156 })
157 bar.operateState <- func(s *bState) {
158 s.amountReceivers = amountReceivers
159 s.shutdownListeners = shutdownListeners
160 }
161 return bar
146162 case <-p.done:
147163 p.bwg.Done()
148164 return nil