diff options
author | Luke Shumaker <lukeshu@beefcake.parabola.nu> | 2018-05-19 10:56:50 -0400 |
---|---|---|
committer | Luke Shumaker <lukeshu@beefcake.parabola.nu> | 2018-05-19 10:56:50 -0400 |
commit | 9899b4cad260e5574b1df611777dbf11aa26d902 (patch) | |
tree | 0c7150dd7c7305a99a29bbd5076e4c5ee5426d40 /go/src/lib/statusline | |
parent | 8c249c0243f660bf5c5c6fb9d403c008534d2bf3 (diff) |
cow-dedupe: fixup statusline
Diffstat (limited to 'go/src/lib/statusline')
-rw-r--r-- | go/src/lib/statusline/async.go | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/go/src/lib/statusline/async.go b/go/src/lib/statusline/async.go index 32c9a2b..5b509ac 100644 --- a/go/src/lib/statusline/async.go +++ b/go/src/lib/statusline/async.go @@ -7,27 +7,38 @@ import ( type AsyncStatusLine struct { lines chan string - end chan struct{} + end1 chan struct{} + end2 chan struct{} } func NewAsyncStatusLine(out io.Writer, d time.Duration) *AsyncStatusLine { ret := &AsyncStatusLine{ lines: make(chan string), - end: make(chan struct{}), + end1: make(chan struct{}), + end2: make(chan struct{}), } go func() { sl := NewStatusLine(out) ticker := time.NewTicker(d) - var line string + var oldLine string + var newLine string + dirty := false for { select { case <-ticker.C: - sl.Put(line) + if dirty && newLine != oldLine { + sl.Put(newLine) + dirty = false + } case l := <-ret.lines: - line = l - case <-ret.end: + newLine = l + dirty = true + case <-ret.end1: sl.End() ticker.Stop() + end2 <- struct{}{} + close(end2) + return } } }() @@ -39,7 +50,8 @@ func (sl *AsyncStatusLine) Put(line string) { } func (sl *AsyncStatusLine) End() { - sl.end <- struct{}{} + sl.end1 <- struct{}{} close(sl.lines) close(sl.end) + <-sl.end2 } |