--- /dev/null
+package errors
+
+import "io"
+
+// NewWriter returns a new Writer that writes to w
+// until an error is returned.
+func NewWriter(w io.Writer) *Writer {
+ return &Writer{w: w}
+}
+
+// Writer is in an implementation of the
+// "sticky error writer" pattern as described
+// in https://blog.golang.org/errors-are-values.
+//
+// A Writer makes one call
+// on the underlying writer for each call to Write,
+// until an error is returned. From that point on,
+// it makes no calls on the underlying writer,
+// and returns the same error value every time.
+type Writer struct {
+ w io.Writer
+ n int64
+ err error
+}
+
+// Write makes one call on the underlying writer
+// if no error has previously occurred.
+func (w *Writer) Write(buf []byte) (n int, err error) {
+ if w.err != nil {
+ return 0, w.err
+ }
+ n, w.err = w.w.Write(buf)
+ w.n += int64(n)
+ return n, w.err
+}
+
+// Err returns the first error encountered by Write, if any.
+func (w *Writer) Err() error {
+ return w.err
+}
+
+// Written returns the number of bytes written
+// to the underlying writer.
+func (w *Writer) Written() int64 {
+ return w.n
+}