package io
type eofReader struct{}
func (eofReader) ([]byte) (int, error) {
return 0, EOF
}
type multiReader struct {
readers []Reader
}
func ( *multiReader) ( []byte) ( int, error) {
for len(.readers) > 0 {
if len(.readers) == 1 {
if , := .readers[0].(*multiReader); {
.readers = .readers
continue
}
}
, = .readers[0].Read()
if == EOF {
.readers[0] = eofReader{}
.readers = .readers[1:]
}
if > 0 || != EOF {
if == EOF && len(.readers) > 0 {
= nil
}
return
}
}
return 0, EOF
}
func ( ...Reader) Reader {
:= make([]Reader, len())
copy(, )
return &multiReader{}
}
type multiWriter struct {
writers []Writer
}
func ( *multiWriter) ( []byte) ( int, error) {
for , := range .writers {
, = .Write()
if != nil {
return
}
if != len() {
= ErrShortWrite
return
}
}
return len(), nil
}
var _ StringWriter = (*multiWriter)(nil)
func ( *multiWriter) ( string) ( int, error) {
var []byte
for , := range .writers {
if , := .(StringWriter); {
, = .WriteString()
} else {
if == nil {
= []byte()
}
, = .Write()
}
if != nil {
return
}
if != len() {
= ErrShortWrite
return
}
}
return len(), nil
}
func ( ...Writer) Writer {
:= make([]Writer, 0, len())
for , := range {
if , := .(*multiWriter); {
= append(, .writers...)
} else {
= append(, )
}
}
return &multiWriter{}
}