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  }