diff --git a/multireader.go b/multireader.go index c0c907a..49ce804 100644 --- a/multireader.go +++ b/multireader.go @@ -1,3 +1,4 @@ +//Package multireader provides capability for single writer to multiple reader package multireader import ( @@ -33,6 +34,7 @@ type Reader struct { closed bool } +//MultiReader initialize new MultiReader object. The object also implements WriteCloser. func NewMultiReader(len int) *MultiReader { if len < 0 { len = 0 @@ -51,6 +53,7 @@ func NewMultiReader(len int) *MultiReader { } } +// Write implements Writer interface. The function will not return error. Error return only satisfy the interface. func (m *MultiReader) Write(data []byte) (int, error) { m.mtx.Lock() defer m.mtx.Unlock() @@ -116,6 +119,7 @@ func (m *MultiReader) removeReader(id int) { m.pos = nb } +// Close will not return error. The error return only satisfy the interface signature. func (m *MultiReader) Close() error { m.mtx.Lock() defer m.mtx.Unlock() @@ -123,6 +127,7 @@ func (m *MultiReader) Close() error { return nil } +// NewReader initialize new Reader object. The object implements ReadCloser and Seeker interface. func (m *MultiReader) NewReader() *Reader { m.mtx.Lock() defer m.mtx.Unlock() @@ -141,6 +146,8 @@ func (m *MultiReader) NewReader() *Reader { return reader } +// Read implements Reader interface. If the reader reached the same position with the writer. It will wait. +// Calling Read() is the same with calling WaitAvailable(), ReadAhead(), and Seek() func (r *Reader) Read(data []byte) (int, error) { r.mtx.Lock() defer r.mtx.Unlock() @@ -184,6 +191,8 @@ func (r *Reader) seek(offset int, whence int) (int, error) { return r.readPos, nil } +// Seek implements Seeker interface. The underlying function will move the reader position. +// It only returns error when the whence parameter is not in io.SeekStart, io.SeekCurrent, io.SeekEnd func (r *Reader) Seek(offset int64, whence int) (int64, error) { n, err := r.seek(int(offset), whence) return int64(n), err @@ -203,6 +212,7 @@ func (r *Reader) readAhead(data []byte) (int, error) { return len(data), nil } +// ReadAhead reads buffer ahead of current position without moving the reader position. func (r *Reader) ReadAhead(data []byte) (int, error) { r.mtx.Lock() defer r.mtx.Unlock() @@ -227,12 +237,14 @@ func (r *Reader) waitAvailable() (int, error) { return r.multiReader.lastWritePos - r.readPos, nil } +// WaitAvailable will only wait when Reader position reached Writer position. func (r *Reader) WaitAvailable() (int, error) { r.mtx.Lock() defer r.mtx.Unlock() return r.waitAvailable() } +// Close implements ReadCloser interface. It will not return error. func (r *Reader) Close() error { r.mtx.Lock() defer r.mtx.Unlock()