Codebase list golang-github-vbauerster-mpb / 7e298e6
WithRenderDelay Vladimir Bauer 6 years ago
2 changed file(s) with 29 addition(s) and 7 deletion(s). Raw diff Collapse all Expand all
4242 // Refresh will occur upon receive value from provided ch.
4343 func WithManualRefresh(ch <-chan time.Time) ContainerOption {
4444 return func(s *pState) {
45 s.manualRefreshCh = ch
45 s.manualRefresh = ch
46 }
47 }
48
49 // WithRenderDelay delays rendering. By default rendering starts as
50 // soon as bar is added, with this option it's possible to delay
51 // rendering process by keeping provided chan unclosed. In other words
52 // rendering will start as soon as provided chan is closed.
53 func WithRenderDelay(ch <-chan struct{}) ContainerOption {
54 return func(s *pState) {
55 s.renderDelay = ch
4656 }
4757 }
4858
6070 func WithOutput(w io.Writer) ContainerOption {
6171 return func(s *pState) {
6272 if w == nil {
63 s.manualRefreshCh = make(chan time.Time)
73 s.manualRefresh = make(chan time.Time)
6474 s.output = ioutil.Discard
6575 return
6676 }
4848 popCompleted bool
4949 rr time.Duration
5050 uwg *sync.WaitGroup
51 manualRefreshCh <-chan time.Time
51 manualRefresh <-chan time.Time
52 renderDelay <-chan struct{}
5253 shutdownNotifier chan struct{}
5354 parkedBars map[*Bar]*Bar
5455 output io.Writer
207208 manualOrTickCh, cleanUp := s.manualOrTick()
208209 defer cleanUp()
209210
210 refreshCh := fanInRefreshSrc(p.done, p.forceRefresh, manualOrTickCh)
211 refreshCh := fanInRefreshSrc(p.done, s.renderDelay, p.forceRefresh, manualOrTickCh)
211212
212213 for {
213214 select {
303304 }
304305
305306 func (s *pState) manualOrTick() (<-chan time.Time, func()) {
306 if s.manualRefreshCh != nil {
307 return s.manualRefreshCh, func() {}
307 if s.manualRefresh != nil {
308 return s.manualRefresh, func() {}
308309 }
309310 ticker := time.NewTicker(s.rr)
310311 return ticker.C, ticker.Stop
372373 }
373374 }
374375
375 func fanInRefreshSrc(done <-chan struct{}, channels ...<-chan time.Time) <-chan time.Time {
376 func fanInRefreshSrc(done, delay <-chan struct{}, channels ...<-chan time.Time) <-chan time.Time {
376377 var wg sync.WaitGroup
377378 multiplexedStream := make(chan time.Time)
379 start := make(chan struct{})
378380
379381 multiplex := func(c <-chan time.Time) {
380382 defer wg.Done()
383 <-start
381384 // source channels are never closed (time.Ticker never closes associated
382385 // channel), so we cannot simply range over a c, instead we use select
383386 // inside infinite loop
395398 }
396399 }
397400
401 if delay != nil {
402 go func() {
403 <-delay
404 close(start)
405 }()
406 } else {
407 close(start)
408 }
409
398410 wg.Add(len(channels))
399411 for _, c := range channels {
400412 go multiplex(c)