summaryrefslogtreecommitdiff
path: root/go/src/lib/statusline/async.go
diff options
context:
space:
mode:
Diffstat (limited to 'go/src/lib/statusline/async.go')
-rw-r--r--go/src/lib/statusline/async.go26
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
}