package io2 import "io" type nopWriteCloser struct { writer io.Writer } func NopWriteCloser(w io.Writer) io.WriteCloser { return &nopWriteCloser{writer: w} } func (w *nopWriteCloser) Write(p []byte) (n int, err error) { return w.writer.Write(p) } func (w *nopWriteCloser) Close() error { return nil } type delegateWriteCloser struct { writer io.Writer fn func() error } func DelegateWriteCloser(w io.Writer, fn func() error) io.WriteCloser { return &delegateWriteCloser{writer: w, fn: fn} } func (w *delegateWriteCloser) Write(p []byte) (n int, err error) { return w.writer.Write(p) } func (w *delegateWriteCloser) Close() error { return w.fn() } type delegateReadCloser struct { reader io.Reader fn func() error } func DelegateReadCloser(r io.Reader, fn func() error) io.ReadCloser { return &delegateReadCloser{reader: r, fn: fn} } func (r *delegateReadCloser) Read(p []byte) (n int, err error) { return r.reader.Read(p) } func (r *delegateReadCloser) Close() error { return r.fn() }