package main

import (
	"bufio"
	"bytes"
	"io"
)

// 封装一个结构体, 此结构体不对外导出
// 内部的两个元素同样是不对外导出的, 只能通过CountingWriter方法获取
type countWriter struct {
	w io.Writer
	c *int64
}

func (c countWriter) Write(p []byte) (n int, err error) {
	var sc = bufio.NewScanner(bytes.NewReader(p))
	sc.Split(bufio.ScanWords)
	for sc.Scan() {
		// 由于是值传递, 这里想改变原调用者的值, 必须使用指针
		// 此处n++是要计算新增的单词数
		n++
		// 此处c++是总的单词数
		*c.c++
	}
	return int(n), nil
}

func CountingWriter(w io.Writer) (io.Writer, *int64) {
	var c int64
	return &countWriter{w, &c}, &c
}
