Source file
test/typeparam/issue51925.go
1
2
3
4
5
6
7 package main
8
9 import "fmt"
10
11 type IntLike interface {
12 ~int | ~int64 | ~int32 | ~int16 | ~int8
13 }
14
15 func Reduce[T any, U any, Uslice ~[]U](function func(T, U) T, sequence Uslice, initial T) T {
16 result := initial
17 for _, x := range sequence {
18 result = function(result, x)
19 }
20 return result
21 }
22
23 func min[T IntLike](x, y T) T {
24 if x < y {
25 return x
26 }
27 return y
28 }
29
30
31 func Min[T IntLike, NumSlice ~[]T](nums NumSlice) T {
32 if len(nums) == 0 {
33 return T(0)
34 }
35 return Reduce(min[T], nums, nums[0])
36 }
37
38
39 func VarMin[T IntLike](nums ...T) T {
40 return Min(nums)
41 }
42
43 type myInt int
44
45 func main() {
46 fmt.Println(VarMin(myInt(1), myInt(2)))
47
48 seq := []myInt{1, 2}
49 fmt.Println(Min(seq))
50 fmt.Println(VarMin(seq...))
51 }
52
View as plain text