1*1fa6dee9SAndroid Build Coastguard Workerpackage proptools 2*1fa6dee9SAndroid Build Coastguard Worker 3*1fa6dee9SAndroid Build Coastguard Workerimport ( 4*1fa6dee9SAndroid Build Coastguard Worker "errors" 5*1fa6dee9SAndroid Build Coastguard Worker "math" 6*1fa6dee9SAndroid Build Coastguard Worker "strings" 7*1fa6dee9SAndroid Build Coastguard Worker) 8*1fa6dee9SAndroid Build Coastguard Worker 9*1fa6dee9SAndroid Build Coastguard Workerfunc ShardBySize[T ~[]E, E any](toShard T, shardSize int) []T { 10*1fa6dee9SAndroid Build Coastguard Worker if len(toShard) == 0 { 11*1fa6dee9SAndroid Build Coastguard Worker return nil 12*1fa6dee9SAndroid Build Coastguard Worker } 13*1fa6dee9SAndroid Build Coastguard Worker 14*1fa6dee9SAndroid Build Coastguard Worker ret := make([]T, 0, (len(toShard)+shardSize-1)/shardSize) 15*1fa6dee9SAndroid Build Coastguard Worker for len(toShard) > shardSize { 16*1fa6dee9SAndroid Build Coastguard Worker ret = append(ret, toShard[0:shardSize]) 17*1fa6dee9SAndroid Build Coastguard Worker toShard = toShard[shardSize:] 18*1fa6dee9SAndroid Build Coastguard Worker } 19*1fa6dee9SAndroid Build Coastguard Worker if len(toShard) > 0 { 20*1fa6dee9SAndroid Build Coastguard Worker ret = append(ret, toShard) 21*1fa6dee9SAndroid Build Coastguard Worker } 22*1fa6dee9SAndroid Build Coastguard Worker return ret 23*1fa6dee9SAndroid Build Coastguard Worker} 24*1fa6dee9SAndroid Build Coastguard Worker 25*1fa6dee9SAndroid Build Coastguard Workerfunc ShardByCount[T ~[]E, E any](toShard T, shardCount int) []T { 26*1fa6dee9SAndroid Build Coastguard Worker return ShardBySize(toShard, int(math.Ceil(float64(len(toShard))/float64(shardCount)))) 27*1fa6dee9SAndroid Build Coastguard Worker} 28*1fa6dee9SAndroid Build Coastguard Worker 29*1fa6dee9SAndroid Build Coastguard Worker// MergeErrors merges a list of errors into a single error. 30*1fa6dee9SAndroid Build Coastguard Workerfunc MergeErrors(errs []error) error { 31*1fa6dee9SAndroid Build Coastguard Worker if errs != nil { 32*1fa6dee9SAndroid Build Coastguard Worker var sb strings.Builder 33*1fa6dee9SAndroid Build Coastguard Worker for i, err := range errs { 34*1fa6dee9SAndroid Build Coastguard Worker if i != 0 { 35*1fa6dee9SAndroid Build Coastguard Worker sb.WriteString("\n") 36*1fa6dee9SAndroid Build Coastguard Worker } 37*1fa6dee9SAndroid Build Coastguard Worker sb.WriteString(err.Error()) 38*1fa6dee9SAndroid Build Coastguard Worker } 39*1fa6dee9SAndroid Build Coastguard Worker return errors.New(sb.String()) 40*1fa6dee9SAndroid Build Coastguard Worker } 41*1fa6dee9SAndroid Build Coastguard Worker return nil 42*1fa6dee9SAndroid Build Coastguard Worker} 43