https://golang.design/s/go2generics
func MaxInt(a, b int) int {
if a < b {
return b
}
return a
}
func MaxFloat64(a, b float64) float64 {
if a < b {
return b
}
return a
}
func MaxUintptr(a, b uintptr) uintptr {
if a < b {
return b
}
return a
}
...
type Lesser(t) interface {
Less(t) bool
}
func Max(a, b t type Lesser(t)) t {
if a.Less(b) {
return b
}
return a
}
gen [T] type Lesser interface {
Less(T) bool
}
gen [T Lesser[T]] func Max(a, b T) T {
if a.Less(b) {
return b
}
return a
}
gen [T] (
type Lesser interface {
Less(T) bool
}
func Max(a, b T) T {
if a.Less(b) {
return b
}
return a
}
)
type [T] Lesser interface {
Less(T) bool
}
func [T] Max(a, b T) T {
if a.Less(b) {
return b
}
return a
}
import "github.com/cheekybits/genny/generic"
// cat max.go | genny gen "T=NUMBERS" > max_gen.go
type T generic.Type
func MaxT(less func(a, b T) bool, a, b T) T {
if less(a, b) {
return b
}
return a
}
const func Max(a, b gotype) gotype {
switch a.(type) {
case int, float64, uintptr:
if a < b {
return b
}
return a
default:
aa, ok := a.(interface{ Less(gotype) bool })
if !ok {
panic("a must implements Less")
}
if aa.Less(b) {
return b
}
return a
}
}
contract Ordered(x T) {
x < x
x > x
x == x
}
func Max(type T Ordered)(a, b T) T {
if a < b {
return b
}
return a
}
contract Ordered(T) {
T int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64, uintptr,
float32, float64
}
func Max(type T Ordered)(a, b T) T {
if a < b {
return b
}
return a
}
type Integer interface {
type int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64, uintptr,
float32, float64
}
func Max(type T Integer)(a, b T) T {
if a < b {
return b
}
return a
}
type Integer interface {
type int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64, uintptr,
float32, float64
}
func Max[T Integer](a, b T) T {
if a < b {
return b
}
return a
}
type Integer interface {
~int | ~int8 | ~int16 | ~int32 | ~int64 |
~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
~float32 | ~float64
}
func Max[T Integer](a, b T) T {
if a < b {
return b
}
return a
}