42 lines
600 B
Go
42 lines
600 B
Go
|
package garage
|
||
|
|
||
|
import "io"
|
||
|
|
||
|
type infiniteReader struct {
|
||
|
b []byte
|
||
|
i int
|
||
|
}
|
||
|
|
||
|
// NewInfiniteReader returns a reader which will produce the given bytes in
|
||
|
// repetition. len(b) must be greater than 0.
|
||
|
func NewInfiniteReader(b []byte) io.Reader {
|
||
|
|
||
|
if len(b) == 0 {
|
||
|
panic("len(b) must be greater than 0")
|
||
|
}
|
||
|
|
||
|
return &infiniteReader{b: b}
|
||
|
}
|
||
|
|
||
|
func (r *infiniteReader) Read(b []byte) (int, error) {
|
||
|
|
||
|
// here, have a puzzle
|
||
|
|
||
|
var n int
|
||
|
|
||
|
for {
|
||
|
|
||
|
n += copy(b[n:], r.b[r.i:])
|
||
|
|
||
|
if r.i > 0 {
|
||
|
n += copy(b[n:], r.b[:r.i])
|
||
|
}
|
||
|
|
||
|
r.i = (r.i + n) % len(r.b)
|
||
|
|
||
|
if n >= len(b) {
|
||
|
return n, nil
|
||
|
}
|
||
|
}
|
||
|
}
|