33 lines
		
	
	
		
			471 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			33 lines
		
	
	
		
			471 B
		
	
	
	
		
			Go
		
	
	
	
	
	
package tool
 | 
						|
 | 
						|
import "iter"
 | 
						|
 | 
						|
func Bulk[T any](slice []T, size int) iter.Seq2[int, []T] {
 | 
						|
	if size <= 0 {
 | 
						|
		panic("bulk size must be positive")
 | 
						|
	}
 | 
						|
 | 
						|
	s := make([]T, 0, size)
 | 
						|
	idx := 0
 | 
						|
	return func(yield func(int, []T) bool) {
 | 
						|
		for i := range slice {
 | 
						|
			s = append(s, (slice)[i])
 | 
						|
			if len(s) >= size {
 | 
						|
 | 
						|
				// send to handle
 | 
						|
				ok := yield(idx, s)
 | 
						|
				if !ok {
 | 
						|
					return
 | 
						|
				}
 | 
						|
 | 
						|
				idx++
 | 
						|
				s = make([]T, 0, size)
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		if len(s) > 0 {
 | 
						|
			yield(idx, s)
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |