package ctxio import ( "context" "io" ) type ReaderAtCloser interface { ReaderAt Closer } type ReaderAt interface { ReadAt(ctx context.Context, p []byte, off int64) (n int, err error) } type Reader interface { Read(ctx context.Context, p []byte) (n int, err error) } type Closer interface { Close(ctx context.Context) error } type contextReader struct { ctx context.Context r Reader } func (r *contextReader) Read(p []byte) (n int, err error) { return r.r.Read(r.ctx, p) } func IoReaderAt(ctx context.Context, r ReaderAt) io.ReaderAt { return &contextReaderAt{ctx: ctx, r: r} } type contextReaderAt struct { ctx context.Context r ReaderAt } func (c *contextReaderAt) ReadAt(p []byte, off int64) (n int, err error) { return c.r.ReadAt(c.ctx, p, off) } func IoReader(ctx context.Context, r Reader) io.Reader { return &contextReader{ctx: ctx, r: r} }