package cursor import "io" // BufferedReaderAt uses a buffer to supplement an io.Reader // with limited backward seeking. type BufferedReaderAt struct{} func NewBufferedReaderAt(r io.Reader, minBuffer uint64) *BufferedReaderAt // ReadAt reads bytes from the underlying reader. If the offset is after // the end of the buffer, ReadAt will first read and ignore bytes from the // underlying reader until it reaches the offset. If the offset is // before the start of the buffer, ReadAt will return an error. // // If your parser needs unlimited lookahead, you should probably // just read the whole input into a slice and use BytesCursor. func (b *BufferedReaderAt) ReadAt(dst []byte, offset int64) (int, error) // RuneReader is an io.RuneReader backed by a Cursor, for compatibility // with the regexp package. type RuneReader struct { cursor Cursor[byte] } func NewRuneReader(c Cursor[byte]) *RuneReader { return &RuneReader{cursor: c} } func (r *RuneReader) Read(dst []byte) (int, error) { n, c, err := r.cursor.Read(dst) r.cursor = c return int(n), err } func (r *RuneReader) Cursor() Cursor[byte] { return r.cursor }