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  }