Skip to content

Commit

Permalink
specialization
Browse files Browse the repository at this point in the history
  • Loading branch information
shogo82148 committed Nov 8, 2022
1 parent 95c2463 commit 720ea57
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 4 deletions.
31 changes: 29 additions & 2 deletions reader.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package ctxio

import (
"bufio"
"bytes"
"context"
"io"
"io/fs"
"strings"
"sync"
"time"
)
Expand All @@ -13,9 +16,21 @@ type readDeadlineSetter interface {
}

func NewReader(reader io.Reader) ReadCloser {
if reader, ok := reader.(Reader); ok {
return NopCloser(reader)
switch r := reader.(type) {
case *bufio.ReadWriter:
return &nopReader{r}
case *bufio.Reader:
return &nopReader{r}
case *bytes.Reader:
return &nopReader{r}
case *bytes.Buffer:
return &nopReader{r}
case *strings.Reader:
return &nopReader{r}
case Reader:
return NopCloser(r)
}

if setter, ok := reader.(readDeadlineSetter); ok {
if err := setter.SetReadDeadline(time.Time{}); err == nil {
return newWatchReader(reader, setter)
Expand Down Expand Up @@ -261,3 +276,15 @@ func (r *goReader) loop() {
buf1, buf2 = buf2, buf1
}
}

type nopReader struct {
io.Reader
}

func (r *nopReader) ReadContext(ctx context.Context, data []byte) (int, error) {
return r.Read(data)
}

func (r *nopReader) Close() error {
return nil
}
28 changes: 26 additions & 2 deletions writer.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package ctxio

import (
"bufio"
"bytes"
"context"
"io"
"strings"
"sync"
"time"
)
Expand All @@ -25,8 +28,17 @@ func (w writeCloser) Close() error {
}

func NewWriter(writer io.Writer) WriteCloser {
if writer, ok := writer.(Writer); ok {
return writeCloser{writer}
switch w := writer.(type) {
case bufio.ReadWriter:
return &nopWriter{w}
case *bufio.Writer:
return &nopWriter{w}
case *bytes.Buffer:
return &nopWriter{w}
case *strings.Builder:
return &nopWriter{w}
case Writer:
return writeCloser{w}
}
if setter, ok := writer.(writeDeadlineSetter); ok {
if err := setter.SetWriteDeadline(time.Time{}); err == nil {
Expand Down Expand Up @@ -244,3 +256,15 @@ func (w *goWriter) loop() {
req.ch <- res
}
}

type nopWriter struct {
io.Writer
}

func (w *nopWriter) WriteContext(ctx context.Context, data []byte) (int, error) {
return w.Write(data)
}

func (w *nopWriter) Close() error {
return nil
}

0 comments on commit 720ea57

Please sign in to comment.