30 lines
674 B
Go
30 lines
674 B
Go
package upload
|
|
|
|
import (
|
|
"iter"
|
|
|
|
"golang.org/x/exp/constraints"
|
|
)
|
|
|
|
type Chunk[I constraints.Integer] struct {
|
|
Offset I
|
|
N I
|
|
}
|
|
|
|
// Chunks yields a sequence of a part number and a Chunk. The Chunk is the offset
|
|
// and size of the chunk. The last chunk may be smaller than chunkSize if size is
|
|
// not a multiple of chunkSize.
|
|
//
|
|
// The first part number is 1 and increases monotonically.
|
|
func Chunks[I constraints.Integer](size, chunkSize I) iter.Seq2[int, Chunk[I]] {
|
|
return func(yield func(int, Chunk[I]) bool) {
|
|
var n int
|
|
for off := I(0); off < size; off += chunkSize {
|
|
n++
|
|
if !yield(n, Chunk[I]{off, min(chunkSize, size-off)}) {
|
|
return
|
|
}
|
|
}
|
|
}
|
|
}
|