Refactor the multi-host salt install page.
[arvados.git] / services / keepstore / count.go
index 272b5017cb0d8785a0446a5426aaec3d2c8c3230..700ca19dec958cbf978bc875e2b1f8e71f24bf49 100644 (file)
@@ -22,6 +22,10 @@ func NewCountingReader(r io.Reader, f func(uint64)) io.ReadCloser {
        }
 }
 
+func NewCountingReaderAtSeeker(r readerAtSeeker, f func(uint64)) *countingReaderAtSeeker {
+       return &countingReaderAtSeeker{readerAtSeeker: r, counter: f}
+}
+
 type countingReadWriter struct {
        reader  io.Reader
        writer  io.Writer
@@ -46,3 +50,25 @@ func (crw *countingReadWriter) Close() error {
        }
        return nil
 }
+
+type readerAtSeeker interface {
+       io.ReadSeeker
+       io.ReaderAt
+}
+
+type countingReaderAtSeeker struct {
+       readerAtSeeker
+       counter func(uint64)
+}
+
+func (crw *countingReaderAtSeeker) Read(buf []byte) (int, error) {
+       n, err := crw.readerAtSeeker.Read(buf)
+       crw.counter(uint64(n))
+       return n, err
+}
+
+func (crw *countingReaderAtSeeker) ReadAt(buf []byte, off int64) (int, error) {
+       n, err := crw.readerAtSeeker.ReadAt(buf, off)
+       crw.counter(uint64(n))
+       return n, err
+}