1
2
3
4
5 package io
6
7 import "os"
8
9 type multiReader struct {
10 readers []Reader
11 }
12
13 func (mr *multiReader) Read(p []byte) (n int, err os.Error) {
14 for len(mr.readers) > 0 {
15 n, err = mr.readers[0].Read(p)
16 if n > 0 || err != os.EOF {
17 if err == os.EOF {
18
19
20 err = nil
21 }
22 return
23 }
24 mr.readers = mr.readers[1:]
25 }
26 return 0, os.EOF
27 }
28
29
30
31
32 func MultiReader(readers ...Reader) Reader {
33 return &multiReader{readers}
34 }
35
36 type multiWriter struct {
37 writers []Writer
38 }
39
40 func (t *multiWriter) Write(p []byte) (n int, err os.Error) {
41 for _, w := range t.writers {
42 n, err = w.Write(p)
43 if err != nil {
44 return
45 }
46 if n != len(p) {
47 err = ErrShortWrite
48 return
49 }
50 }
51 return len(p), nil
52 }
53
54
55
56 func MultiWriter(writers ...Writer) Writer {
57 return &multiWriter{writers}
58 }