package utils

// ToMap converts a slice to a map with the keyFunc determining what the key of a value should be.
// Will override any double values.
func ToMap[T any, K comparable](slice []T, keyFunc func(T) K) map[K]T {
	m := make(map[K]T, len(slice))
	for _, v := range slice {
		m[keyFunc(v)] = v
	}
	return m
}

// ToSliceMap converts a slice to a map with the keyFunc determining what the key of a value should be.
// Will append to the slice if the key already exists.
func ToSliceMap[T any, K comparable](slice []T, keyFunc func(T) K) map[K][]T {
	m := make(map[K][]T, len(slice))
	for _, v := range slice {
		key := keyFunc(v)
		m[key] = append(m[key], v)
	}
	return m
}

// 定义泛型约束：只允许数值类型（整数、浮点数等）
type Number interface {
	int | int8 | int16 | int32 | int64 |
		uint | uint8 | uint16 | uint32 | uint64 |
		float32 | float64
}

// Max 泛型函数：接收两个同类型的 Number 参数，返回最大值
func Max[T Number](a, b T) T {
	if a > b {
		return a
	}
	return b
}
