diff --git a/bar.go b/bar.go index 82ba69e..7db860e 100644 --- a/bar.go +++ b/bar.go @@ -54,12 +54,8 @@ buffers [3]*bytes.Buffer filler BarFiller middleware func(BarFiller) BarFiller + extender extenderFunc debugOut io.Writer - - extender struct { - fn extenderFunc - rev bool - } wait struct { bar *Bar // key for (*pState).queueBars @@ -384,16 +380,11 @@ } } s.aborted = !s.completed - s.extender.fn = makePanicExtender(p) + s.extender = makePanicExtender(p) b.recoveredPanic = p } - if fn := s.extender.fn; fn != nil { + if fn := s.extender; fn != nil { rows = fn(rows, s.reqWidth, stat) - if s.extender.rev { - for left, right := 0, len(rows)-1; left < right; left, right = left+1, right-1 { - rows[left], rows[right] = rows[right], rows[left] - } - } } frame := &renderFrame{ rows: rows, @@ -414,13 +405,8 @@ if b.recoveredPanic == nil { rows = append(rows, s.draw(stat)) } - if fn := s.extender.fn; fn != nil { + if fn := s.extender; fn != nil { rows = fn(rows, s.reqWidth, stat) - if s.extender.rev { - for left, right := 0, len(rows)-1; left < right; left, right = left+1, right-1 { - rows[left], rows[right] = rows[right], rows[left] - } - } } frame := &renderFrame{ rows: rows, diff --git a/bar_option.go b/bar_option.go index d2233d4..3506ed2 100644 --- a/bar_option.go +++ b/bar_option.go @@ -138,14 +138,13 @@ return nil } return func(s *bState) { - s.extender.fn = makeExtenderFunc(filler) - s.extender.rev = rev - } -} - -func makeExtenderFunc(filler BarFiller) extenderFunc { + s.extender = makeExtenderFunc(filler, rev) + } +} + +func makeExtenderFunc(filler BarFiller, rev bool) extenderFunc { buf := new(bytes.Buffer) - return func(rows []io.Reader, width int, stat decor.Statistics) []io.Reader { + base := func(rows []io.Reader, width int, stat decor.Statistics) []io.Reader { buf.Reset() filler.Fill(buf, width, stat) for { @@ -157,6 +156,18 @@ } return rows } + + if !rev { + return base + } else { + return func(rows []io.Reader, width int, stat decor.Statistics) []io.Reader { + rows = base(rows, width, stat) + for left, right := 0, len(rows)-1; left < right; left, right = left+1, right-1 { + rows[left], rows[right] = rows[right], rows[left] + } + return rows + } + } } // BarFillerTrim removes leading and trailing space around the underlying BarFiller.