summaryrefslogtreecommitdiffstats
path: root/test/typeparam/issue51925.go
diff options
context:
space:
mode:
Diffstat (limited to 'test/typeparam/issue51925.go')
-rw-r--r--test/typeparam/issue51925.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/test/typeparam/issue51925.go b/test/typeparam/issue51925.go
new file mode 100644
index 0000000..0a385ac
--- /dev/null
+++ b/test/typeparam/issue51925.go
@@ -0,0 +1,52 @@
+// compile
+
+// Copyright 2022 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+import "fmt"
+
+type IntLike interface {
+ ~int | ~int64 | ~int32 | ~int16 | ~int8
+}
+
+func Reduce[T any, U any, Uslice ~[]U](function func(T, U) T, sequence Uslice, initial T) T {
+ result := initial
+ for _, x := range sequence {
+ result = function(result, x)
+ }
+ return result
+}
+
+func min[T IntLike](x, y T) T {
+ if x < y {
+ return x
+ }
+ return y
+
+}
+
+// Min returns the minimum element of `nums`.
+func Min[T IntLike, NumSlice ~[]T](nums NumSlice) T {
+ if len(nums) == 0 {
+ return T(0)
+ }
+ return Reduce(min[T], nums, nums[0])
+}
+
+// VarMin is the variadic version of Min.
+func VarMin[T IntLike](nums ...T) T {
+ return Min(nums)
+}
+
+type myInt int
+
+func main() {
+ fmt.Println(VarMin(myInt(1), myInt(2)))
+
+ seq := []myInt{1, 2}
+ fmt.Println(Min(seq))
+ fmt.Println(VarMin(seq...))
+}