package bufioutil

import (
	"bufio"
	"io"
)

type BufferedSeeker struct {
	rs io.ReadSeeker
	br *bufio.Reader
}

func NewBufferedSeeker(rs io.ReadSeeker, size int) *BufferedSeeker {
	return &BufferedSeeker{
		rs: rs,
		br: bufio.NewReaderSize(rs, size),
	}
}

func (b *BufferedSeeker) Read(p []byte) (int, error) {
	return b.br.Read(p)
}

func (b *BufferedSeeker) Seek(offset int64, whence int) (int64, error) {
	if whence == io.SeekCurrent {
		offset -= int64(b.br.Buffered())
	}
	n, err := b.rs.Seek(offset, whence)
	if err != nil {
		return 0, err
	}
	b.br.Reset(b.rs)
	return n, nil
}