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 } } }