code: func EnumerateAllFrom(ctx context.Context, src BlobEnumerator, after string, fn func(blob.SizedRef) error) error {
  	const batchSize = 1000
  	var mu sync.Mutex // protects returning with an error while fn is still running
  	errc := make(chan error, 1)
  	for {
  		ch := make(chan blob.SizedRef, 16)
  		n := 0
  		go func() {
  			var err error
  			for sb := range ch {
  				if err != nil {
  					continue
  				}
  				mu.Lock()
  				err = fn(sb)
  				mu.Unlock()
  				after = sb.Ref.String()
  				n++
  			}
  			errc <- err
  		}()
  		err := src.EnumerateBlobs(ctx, ch, after, batchSize)
  		if err != nil {
  			mu.Lock() // make sure fn callback finished; no need to unlock
  			return err
  		}
  		if err := <-errc; err != nil {
  			return err
  		}
  		if n == 0 {
  			return nil
  		}
  	}
  }
docs: // EnumerateAllFrom is like EnumerateAll, but takes an after parameter.