github.com/l3x/learn-fp-go@v0.0.0-20171228022418-7639825d0b71/2-design-patterns/ch05-decoration/01_reader_writer/main.go (about) 1 package main 2 3 import ( 4 "io" 5 "strings" 6 "os" 7 ) 8 9 type titlizeReader struct { 10 src io.Reader 11 } 12 13 func NewTitlizeReader(source io.Reader) *titlizeReader { 14 return &titlizeReader{source} 15 } 16 17 func (t *titlizeReader) Read(p []byte) (int, error) { 18 count, err := t.src.Read(p) 19 if err != nil { 20 return count, err 21 } 22 for i := 0; i < len(p); i++ { 23 if i == 0 { 24 if p[i] >= 't' && p[i] <= 'z' { 25 p[i] = p[i] - 32 26 } 27 } else { 28 if p[i] >= 'A' && p[i] <= 'Z' { 29 p[i] = p[i] + 32 30 } 31 } 32 } 33 return count, io.EOF 34 } 35 36 func main() { 37 var r io.Reader 38 r = strings.NewReader("this IS a tEsT") 39 r = io.LimitReader(r, 12) 40 r = NewTitlizeReader(r) 41 42 var w io.Writer 43 w = os.Stdout 44 io.Copy(w, r) 45 }