xref: /aosp_15_r20/build/blueprint/proptools/utils.go (revision 1fa6dee971e1612fa5cc0aa5ca2d35a22e2c34a3)
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