package statusline import ( "io" "time" ) type AsyncStatusLine struct { lines chan string end1 chan struct{} end2 chan struct{} } func NewAsyncStatusLine(out io.Writer, d time.Duration) *AsyncStatusLine { ret := &AsyncStatusLine{ lines: make(chan string), end1: make(chan struct{}), end2: make(chan struct{}), } go func() { sl := NewStatusLine(out) ticker := time.NewTicker(d) var oldLine string var newLine string dirty := false for { select { case <-ticker.C: if dirty && newLine != oldLine { sl.Put(newLine) dirty = false } case l := <-ret.lines: newLine = l dirty = true case <-ret.end1: sl.End() ticker.Stop() end2 <- struct{}{} close(end2) return } } }() return ret } func (sl *AsyncStatusLine) Put(line string) { sl.lines <- line } func (sl *AsyncStatusLine) End() { sl.end1 <- struct{}{} close(sl.lines) close(sl.end) <-sl.end2 }