github.com/graybobo/golang.org-package-offline-cache@v0.0.0-20200626051047-6608995c132f/x/talks/2015/tricks/broadcastwriter/broadcastwriter.go (about) 1 package broadcastwriter 2 3 import ( 4 "io" 5 "sync" 6 ) 7 8 type BroadcastWriter struct { 9 sync.Mutex 10 writers map[io.WriteCloser]struct{} 11 } 12 13 func (w *BroadcastWriter) AddWriter(writer io.WriteCloser) { 14 w.Lock() 15 w.writers[writer] = struct{}{} 16 w.Unlock() 17 } 18 19 func (w *BroadcastWriter) Write(p []byte) (n int, err error) { 20 w.Lock() 21 for sw := range w.writers { 22 if n, err := sw.Write(p); err != nil || n != len(p) { 23 delete(w.writers, sw) 24 } 25 } 26 w.Unlock() 27 return len(p), nil 28 } 29 30 // END OMIT 31 32 func (w *BroadcastWriter) Clean() error { 33 w.Lock() 34 for w := range w.writers { 35 w.Close() 36 } 37 w.writers = make(map[io.WriteCloser]struct{}) 38 w.Unlock() 39 return nil 40 } 41 42 func New() *BroadcastWriter { 43 return &BroadcastWriter{ 44 writers: make(map[io.WriteCloser]struct{}), 45 } 46 }