Initial QSfera import
This commit is contained in:
+73
@@ -0,0 +1,73 @@
|
||||
package topdown
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"io"
|
||||
)
|
||||
|
||||
var _ io.Writer = (*sinkW)(nil)
|
||||
|
||||
type sinkWriter interface {
|
||||
io.Writer
|
||||
String() string
|
||||
Grow(int)
|
||||
WriteByte(byte) error
|
||||
WriteString(string) (int, error)
|
||||
}
|
||||
|
||||
type sinkW struct {
|
||||
buf *bytes.Buffer
|
||||
cancel Cancel
|
||||
err error
|
||||
}
|
||||
|
||||
func newSink(name string, hint int, c Cancel) sinkWriter {
|
||||
b := &bytes.Buffer{}
|
||||
if hint > 0 {
|
||||
b.Grow(hint)
|
||||
}
|
||||
|
||||
if c == nil {
|
||||
return b
|
||||
}
|
||||
|
||||
return &sinkW{
|
||||
cancel: c,
|
||||
buf: b,
|
||||
err: Halt{
|
||||
Err: &Error{
|
||||
Code: CancelErr,
|
||||
Message: name + ": timed out before finishing",
|
||||
},
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (sw *sinkW) Grow(n int) {
|
||||
sw.buf.Grow(n)
|
||||
}
|
||||
|
||||
func (sw *sinkW) Write(bs []byte) (int, error) {
|
||||
if sw.cancel.Cancelled() {
|
||||
return 0, sw.err
|
||||
}
|
||||
return sw.buf.Write(bs)
|
||||
}
|
||||
|
||||
func (sw *sinkW) WriteByte(b byte) error {
|
||||
if sw.cancel.Cancelled() {
|
||||
return sw.err
|
||||
}
|
||||
return sw.buf.WriteByte(b)
|
||||
}
|
||||
|
||||
func (sw *sinkW) WriteString(s string) (int, error) {
|
||||
if sw.cancel.Cancelled() {
|
||||
return 0, sw.err
|
||||
}
|
||||
return sw.buf.WriteString(s)
|
||||
}
|
||||
|
||||
func (sw *sinkW) String() string {
|
||||
return sw.buf.String()
|
||||
}
|
||||
Reference in New Issue
Block a user