Files
dolt/go/util/progressreader/reader.go
2016-06-05 02:14:49 -07:00

43 lines
772 B
Go

// Copyright 2016 The Noms Authors. All rights reserved.
// Licensed under the Apache License, version 2.0:
// http://www.apache.org/licenses/LICENSE-2.0
// Package progressreader provides an io.Reader that reports progress to a callback
package progressreader
import (
"io"
)
type Callback func(seen uint64)
func New(inner io.Reader, cb Callback) io.Reader {
return &reader{
inner,
uint64(0),
uint64(0),
cb,
}
}
type reader struct {
inner io.Reader
seen uint64
lastMult uint64
cb Callback
}
const reportFreq = 2 << 19 // 1 MB
func (r *reader) Read(p []byte) (n int, err error) {
mult := uint64(r.seen / reportFreq)
if mult > r.lastMult {
r.cb(r.seen)
r.lastMult = mult
}
n, err = r.inner.Read(p)
r.seen += uint64(n)
return
}