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 ( *multiReader) ( Writer) ( int64, error) {
return .writeToWithBuffer(, make([]byte, 1024*32))
}
func ( *multiReader) ( Writer, []byte) ( int64, error) {
for , := range .readers {
var int64
if , := .(*multiReader); {
, = .(, )
} else {
, = copyBuffer(, , )
}
+=
if != nil {
.readers = .readers[:]
return ,
}
.readers[] = nil
}
.readers = nil
return , nil
}
var _ WriterTo = (*multiReader)(nil)
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{}
}