Copyright 2011 The Go Authors. All rights reserved. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

package norm

import 

type normWriter struct {
	rb  reorderBuffer
	w   io.Writer
	buf []byte
}
Write implements the standard write interface. If the last characters are not at a normalization boundary, the bytes will be buffered for the next write. The remaining bytes will be written on close.
Process data in pieces to keep w.buf size bounded.
	const  = 4000

Normalize into w.buf.
		 := len()
		if  >  {
			 = 
		}
		.rb.src = inputBytes([:])
		.rb.nsrc = 
		.buf = doAppend(&.rb, .buf, 0)
		 = [:]
		 += 
Write out complete prefix, save remainder. Note that lastBoundary looks back at most 31 runes.
		 := lastBoundary(&.rb.f, .buf)
		if  == -1 {
			 = 0
		}
		if  > 0 {
			if _,  = .w.Write(.buf[:]);  != nil {
				break
			}
			 := copy(.buf, .buf[:])
			.buf = .buf[:]
		}
	}
	return , 
}
Close forces data that remains in the buffer to be written.
func ( *normWriter) () error {
	if len(.buf) > 0 {
		,  := .w.Write(.buf)
		if  != nil {
			return 
		}
	}
	return nil
}
Writer returns a new writer that implements Write(b) by writing f(b) to w. The returned writer may use an internal buffer to maintain state across Write calls. Calling its Close method writes any buffered data to w.
Read implements the standard read interface.
func ( *normReader) ( []byte) (int, error) {
	for {
		if .lastBoundary-.bufStart > 0 {
			 := copy(, .outbuf[.bufStart:.lastBoundary])
			.bufStart += 
			if .lastBoundary-.bufStart > 0 {
				return , nil
			}
			return , .err
		}
		if .err != nil {
			return 0, .err
		}
		 := copy(.outbuf, .outbuf[.lastBoundary:])
		.outbuf = .outbuf[0:]
		.bufStart = 0

		,  := .r.Read(.inbuf)
		.rb.src = inputBytes(.inbuf[0:])
		.rb.nsrc, .err = , 
		if  > 0 {
			.outbuf = doAppend(&.rb, .outbuf, 0)
		}
		if  == io.EOF {
			.lastBoundary = len(.outbuf)
		} else {
			.lastBoundary = lastBoundary(&.rb.f, .outbuf)
			if .lastBoundary == -1 {
				.lastBoundary = 0
			}
		}
	}
}
Reader returns a new reader that implements Read by reading data from r and returning f(data).
func ( Form) ( io.Reader) io.Reader {
	const  = 4000
	 := make([]byte, )
	 := &normReader{rb: reorderBuffer{}, r: , inbuf: }
	.rb.init(, )
	return