github.com/jmigpin/editor@v1.6.0/util/iout/pausedwriter.go (about) 1 package iout 2 3 import ( 4 "io" 5 "sync" 6 ) 7 8 type PausedWriter struct { 9 Wr io.Writer 10 mu sync.Mutex 11 cond *sync.Cond 12 paused bool 13 } 14 15 func NewPausedWriter(wr io.Writer) *PausedWriter { 16 pw := &PausedWriter{Wr: wr} 17 pw.cond = sync.NewCond(&pw.mu) 18 pw.paused = true 19 return pw 20 } 21 func (pw *PausedWriter) Write(b []byte) (int, error) { 22 pw.mu.Lock() 23 defer pw.mu.Unlock() 24 for pw.paused { 25 pw.cond.Wait() 26 } 27 return pw.Wr.Write(b) 28 } 29 func (pw *PausedWriter) Pause(v bool) { 30 pw.mu.Lock() 31 defer pw.mu.Unlock() 32 pw.paused = v 33 pw.cond.Signal() 34 } 35 func (pw *PausedWriter) Unpause() { 36 pw.Pause(false) 37 }