mirror of
https://github.com/ScuroNeko/mtg.git
synced 2026-08-31 21:54:01 +03:00
Add buffered reader
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
package wrappers
|
||||
|
||||
import "bytes"
|
||||
|
||||
type BufferedReader struct {
|
||||
Buffer *bytes.Buffer
|
||||
}
|
||||
|
||||
func (b *BufferedReader) BufferedRead(p []byte, callback func() error) (int, error) {
|
||||
if b.Buffer.Len() > 0 {
|
||||
return b.flush(p)
|
||||
}
|
||||
if err := callback(); err != nil {
|
||||
return 0, err
|
||||
}
|
||||
return b.flush(p)
|
||||
}
|
||||
|
||||
func (b *BufferedReader) flush(p []byte) (int, error) {
|
||||
sizeToRead := len(p)
|
||||
if b.Buffer.Len() < sizeToRead {
|
||||
sizeToRead = b.Buffer.Len()
|
||||
}
|
||||
|
||||
data := b.Buffer.Bytes()
|
||||
copy(p, data[:sizeToRead])
|
||||
if sizeToRead == b.Buffer.Len() {
|
||||
b.Buffer.Reset()
|
||||
} else {
|
||||
b.Buffer = bytes.NewBuffer(data[sizeToRead:])
|
||||
}
|
||||
|
||||
return sizeToRead, nil
|
||||
}
|
||||
|
||||
func NewBufferedReader() BufferedReader {
|
||||
return BufferedReader{Buffer: &bytes.Buffer{}}
|
||||
}
|
||||
Reference in New Issue
Block a user